首页 > 其他分享 >数组-Array

数组-Array

时间:2022-12-06 12:33:44浏览次数:38  
标签:元素 int ArrayList elementData list add 数组 Array

数组(Array)是一种线性表数据结构。它用一组连续的内存空间,来存储一组 具有相同类型数据的集合。

 

 数组的特点:

1.数组是相同数据类型的集合。(int类型的数组不能放double类型)

2.数组中各元素的存储是有先后顺序的,它们在内存中按照这个顺序连续存放到一起。内存地址连续。

3. 数组获取元素的时间复杂度为 O(1)
  • 实现数组列表
在 Java 的源码中,数组是一个非常常用的数据结构。
package array_list;

/**
 * @author cv master
 * @date 2022/12/6 9:59
 */
public interface List<E> {
    boolean add(E e);

    E remove(int index);

    E get(int index);
}

  

1. 初始化 ArrayList 阶段,如果不指定大小,默认会初始化一个空的元素。这个时候是没有默认长度的。 2. 那么什么时候给初始化的长度呢?是在首次添加元素的时候,因为所有的添加元素 操作,也都是需要判断容量,以及是否扩容的。那么在 add 添加元素时统一完成这个操作。 3. 之后就是随着元素的添加,容量是会出现不足。当容量不足的是,需要进行扩容操作。同时还需要把旧数据迁移到新的数组上。另外数据的迁移算是一个比较耗时的操 作。
package array_list;

import java.util.Arrays;

/**
 * @author cv master
 * @date 2022/12/6 10:00
 */
public class ArrayList<E> implements List<E> {
    /**
     * 默认初始化空间
     **/
    private static final int DEFAULT_CAPACITY = 10;

    /**
     * 空元素
     **/
    private static final Object[] DEFAULT_CAPACITY_EMPTY_ELEMENT_DATA = {};
    /**
     * ArrayList 元素数据缓存区
     **/
    transient Object[] elementData;
    /**
     * List集合元素数量
     **/
    private int size;

    public ArrayList() {
        this.elementData = DEFAULT_CAPACITY_EMPTY_ELEMENT_DATA;
    }

    @Override
    public boolean add(E e) {
        //确保内部容量
        int minCapacity = size + 1;
        if (elementData == DEFAULT_CAPACITY_EMPTY_ELEMENT_DATA) {
            minCapacity = Math.max(DEFAULT_CAPACITY, minCapacity);
        }
        //判断扩容操作
        if (minCapacity - elementData.length > 0) {
            int oldCapacity = elementData.length;
            int newCapacity = oldCapacity + (oldCapacity >> 1);
            if (newCapacity - minCapacity < 0) {
                newCapacity = minCapacity;
            }
            elementData=Arrays.copyOf(elementData, newCapacity);
        }
        elementData[size++] = e;
        return true;
    }

    @Override
    public E remove(int index) {
        E element = (E) elementData[index];
        int numMoved = size - index - 1;
        if (numMoved > 0) {
            System.arraycopy(elementData, index + 1, elementData, index, numMoved);
        }
        elementData[--size] = null;// clear to let GC do its work
        return element;
    }

    @Override
    public E get(int index) {
        return (E) elementData[index];
    }

    @Override
    public String toString() {
        return "ArrayList{" +
                "elementData=" + Arrays.toString(elementData) +
                ", size=" + size +
                '}';
    }
}

  

  • 这是一份简化后的 ArrayList##add 操作
1. 判断当前容量与初始化容量,使用 Math.max 函数取最大值最为最小初始化空间。 2. 接下来是判断 minCapacity 和元素的数量,是否达到了扩容。首次创建 ArrayList 是 一定会扩容的,也就是初始化 DEFAULT_CAPACITY = 10 的容量。 3. Arrays.copyOf 实际上是创建一个新的空间数组,之后调用的 System.arraycopy 迁 移到新创建的数组上。这样后续所有的扩容操作,也就都保持统一了。 4. ArrayList 扩容完成后,就是使用 elementData[size++] = e; 添加元素操作了。      
  • ArrayList 的元素删除。

就是在确定出元素位置后,使用 System.arraycopy 拷贝数据

方式移动数据,把需要删除的元素位置覆盖掉。 此外它还会把已经删除的元素设置为 null 一方面让我们不会在读取到这个元素,另 外一方面也是为了 GC。
package array_list;
import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
 * @author cv master
 * @date 2022/12/6 10:34
 */
public class ArrayListTest {
    private final Logger logger = LoggerFactory.getLogger(ArrayListTest.class);
    @Test
    public void test_array_list() {
        List<String> list = new ArrayList<>();
        list.add("01");
        logger.info(list.toString());
        list.add("02");
        list.add("03");
        list.add("04");
        list.add("05");
        list.add("06");
        list.add("07");
        list.add("08");
        list.add("09");
        list.add("10");
        list.add("11");
        list.add("12");

        logger.info(list.toString());

        list.remove(9);

        logger.info(list.toString());
        System.out.println(list.get(1));
    }
}

  

标签:元素,int,ArrayList,elementData,list,add,数组,Array
From: https://www.cnblogs.com/luorongxin/p/16954789.html

相关文章

  • Go-09 Go语言中数组、切片的排序算法以及sort包
    packagemainimport( "fmt" "sort")//Golang数组中的切片及sort包funcmain(){ //1.选择排序 varnumSlice=[]int{9,8,7,6,5,4} fori:=0;i<le......
  • 05 Java 数组
    Java数组一、什么是数组数组是相同类型数据的有序集合数组描述的是相同类型的若干个数据,按照一定的顺序排列组合而成其中每一个数据称为数组元素,每个数组元素可以通过......
  • vue 数组转组织树
    //树节点中查询遍历组织getNode(data,key,val){lettreeNode="";data.some(item=>{letflag=false;console.log("item[......
  • 连续子数组的最大和
    public class Solution {    public int FindGreatestSumOfSubArray(int[] array) {        int[] dp = new int[array.length];     ......
  • .NET性能优化-ArrayPool同时复用数组和对象
    前两天在微信后台收到了读者的私信,问了一个这样的问题,由于私信回复有字数和篇幅限制,我在这里统一回复一下。读者的问题是这样的:大佬您好,之前读了您的文章受益匪浅,我们有......
  • hdu6153后缀数组或扩展KMP
    前两天刷了几题leetcode,感觉挺简单,于是又想刷刷hduoj了。随便打开没做过的一页,找了一题通过人数最多的,就是这道6153.①.看完题没想太多,觉得应该是后缀数组(多年没刷题的我......
  • [LeetCode] 2270. Number of Ways to Split Array
    Youaregivena 0-indexed integerarray nums oflength n.nums containsa validsplit atindex i ifthefollowingaretrue:Thesumofthefirst i......
  • JAVA array list输出数据
    importjava.util.ArrayList;publicclass数组集合输出数据{publicstaticvoidmain(String[]args){ArrayLista1=newArrayList();a1.add("张......
  • Queries Gym - 100741A - 树状数组
    给定\(n\)和\(m\),对于\(n\)个数字\(a_i\),进行下列三种操作:(1)+pr:将p位置的元素加上r,输出此时p位置的值;(2)-pr:将p位置的元素减去r,若p位置的值小......
  • c语言中-----二分法查找有序数组中某个数的下标
    intmain(){//二分法查找算法:查找(有序排列)数组中6对应的下标并输出intarr[]={1,2,3,4,5,6,7,8,9,10};//下标取中(第一个下标为0),进行比较判断......