ArrayList底层采用数组实现,具有也具有数组的优缺点,同时支持动态扩容(扩展为原来的1.5倍)。所以它非常适合需要使用索引快速访问的场景。同时由于其自动扩容的功能,我们需要注意在初始化集合时需要指定大小。
##02 特点
## 03 具体代码
最后从源码里具体分析一下,ArrayList中的添加(add),随机访问(get),删除(remove),插入(add),扩容操作(grow)。
public boolean add(E e) { ensureCapacityInternal(size + 1); // 确保数组容量足够,否则进行扩容grow elementData[size++] =e;// 为数组[size]赋值,当前数据长度+1 return true;} 复制代码
public E get(int index) { rangeCheck(index); //检查数组下标值是否超过list实际含有的数据量 return elementData(index);// 随机访问数组 } 复制代码
public E remove(int index) { rangeCheck(index);//检查数组下标值是否超过list实际含有的数据量 modCount++;// 迭代遍历时,用于确定list是否被操作过了 E oldValue =elementData(index);//旧值 int numMoved = size - index - 1; i f (numMoved > 0) // 删除的位置不是末尾数据,进行数组的复制 System.arraycopy(elementData,index+1, elementData, index, numMoved); elementData[--size] =null; //删除了一个值,所以原来的数组最后一位数据为null return oldValue; } 复制代码
public void add(int index, E element) { rangeCheckForAdd(index); ensureCapacityInternal(size + 1); // Increments modCount!!grow System.arraycopy(elementData, index,elementData, index + 1, size- index); //复制数组 elementData[index] =element;// 插入数据 size++; } 复制代码
private void grow(int minCapacity) { // overflow-conscious code int oldCapacity = elementData.length; int newCapacity =oldCapacity + (oldCapacity >> 1);//新容量原来的1.5倍 if (newCapacity - minCapacity < 0) newCapacity = minCapacity; if (newCapacity - MAX_ARRAY_SIZE >0) newCapacity =hugeCapacity(minCapacity); // minCapacity is usually close tosize, so this is a win: elementData =Arrays.copyOf(elementData, newCapacity);// 原来的数据复制到扩容后的数组中 } 复制代码