Java基础——List篇 ArrayList (1)ArrayList简介(构造方法;扩容;大小)

 (1)ArrayList简介(构造方法;扩容;大小)

概念:ArrayList是比较常用的集合类。它实现了List接口,而它的底层是由数组实现的。虽然不是线程安全的,但增加删除元素的处理速度相对较快,在不需要多线程的情况下还是很有效的。

 

ArrayList的初始化:当初始化ArrayList时,与之相关的成员变量有以下几个:

/**
     * 默认的初始扩容步长,如果创建ArrayList的时候未指定扩容的步长或者指定步长<10,则采用10为初始的扩容步长
     */
    private static final int DEFAULT_CAPACITY = 10;

    /**
     * 空的elementData数组
     */
    private static final Object[] EMPTY_ELEMENTDATA = {};

    /**
     * 和EMPTY_ELEMENTDATA类似,不同之处在于用DEFAULTCAPACITY_EMPTY_ELEMENTDATA
     * 则加入第一个元素时,以步长为DEFAULT_CAPACITY进行扩容
     */
    private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};

    /**
     * 存储ArrayList中元素的缓存数组(ArrayList底层由数组实现)
     * 数组长度(length)即ArrayList的容量(capacity; size)
     * 用new ArrayList()构造方法创建的对象 == DEFAULTCAPACITY_EMPTY_ELEMENTDATA
     * 当添加第一个元素时,会用步长为 DEFAULT_CAPACITY 进行扩容
     */
    transient Object[] elementData; 

    /**
     * ArrayList中元素的个数
     * @serial
     */
    private int size;

 

构造方法:创建ArrayList对象时,常用的两种方法:

1. new ArrayList()  不加任何参数。此时ArrayList中不包含任何元素,size()为0。

2. new ArrayList(int initialCapacity)   参数为初始的扩容步长,指定添加第一个元素时的扩容步长DEFAULT_CAPACITY。此时ArrayList中不包含任何元素,size()为0。

 

扩容:当向ArrayList中添加元素,而ArrayList的容量(size)又已满时,需要扩容。

扩容机制主要用到的方法是:

1. ensureCapacityInternal方法  判断是否需要扩容(委托给ensureExplicitCapacity方法)

private void ensureCapacityInternal(int minCapacity) {
        ensureExplicitCapacity(calculateCapacity(elementData, minCapacity));
    }

2. calculateCapacity方法  计算最小容量minCapacity。如果minCapacity<=10或ArrayList为空,都用DEFAULT_CAPACITY作为minCapacity

private static int calculateCapacity(Object[] elementData, int minCapacity) {
        if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {
            return Math.max(DEFAULT_CAPACITY, minCapacity);
        }
        return minCapacity;
    }

3. grow方法  扩容的实现方法

private void grow(int minCapacity) {
        /*原有数组容量*/
        int oldCapacity = elementData.length;
        /*新的数组容量,相当于newCapacity = oldCapacity * 1.5 向下取整*/
        int newCapacity = oldCapacity + (oldCapacity >> 1);
        if (newCapacity - minCapacity < 0)
            newCapacity = minCapacity;
        if (newCapacity - MAX_ARRAY_SIZE > 0)
            newCapacity = hugeCapacity(minCapacity);
        /*将原有ArrayList的元素全部拷贝到一个新的ArrayList中*/
        elementData = Arrays.copyOf(elementData, newCapacity);
    }

 

ArrayList的大小:.size()

刚开始创建ArrayList对象时,size为0;之后每添加一个元素,size+1

需要注意的是,可以向ArrayList中添加空串"",或者null(因为添加的是Object[] elementData),此时size仍然会增加。

 

 

参考:https://blog.csdn.net/qq_35358091/article/details/102522476

https://www.cnblogs.com/zhexuejun/p/11149406.html

 

posted @ 2020-06-09 23:16  无ni不欢  阅读(1239)  评论(0编辑  收藏  举报