(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