ArrayList 是 Java 集合框架中的一个动态数组实现类,它基于数组实现了可变长度的列表。
- 内部数组存储:
private transient Object[] elementData;
- 添加元素:
public boolean add(E e) { ensureCapacityInternal(size + 1); // 确保容量足够 elementData[size++] = e; // 将元素添加到数组末尾 return true; }
- 获取元素:
public E get(int index) { rangeCheck(index); // 检查索引范围是否有效 return elementData(index); } @SuppressWarnings("unchecked") E elementData(int index) { return (E) elementData[index]; }
- 删除元素:
public E remove(int index) { rangeCheck(index); modCount++; // 修改操作计数器 E oldValue = elementData(index); int numMoved = size - index - 1; if (numMoved > 0) System.arraycopy(elementData, index + 1, elementData, index, numMoved); elementData[--size] = null; // 将最后一个元素置为null,协助垃圾回收 return oldValue; }
System.arraycopy()
是 Java 中的一个数组复制方法,用于将一个数组中的一部分元素复制到另一个数组中。
public static native void arraycopy(Object src, int srcPos, Object dest, int destPos, int length);
- 参数解释:
src
:源数组,即要复制的原始数组。srcPos
:源数组中复制的起始位置索引。dest
:目标数组,即要将数据复制到的目标数组。destPos
:目标数组中放置的起始位置索引。length
:要复制的元素个数。
5.扩容机制 :
private void ensureCapacityInternal(int minCapacity) { if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) { minCapacity = Math.max(DEFAULT_CAPACITY, minCapacity); // 使用默认容量和所需容量的较大值 } ensureExplicitCapacity(minCapacity); } private void ensureExplicitCapacity(int minCapacity) { modCount++; // 增加修改操作计数器 if (minCapacity - elementData.length > 0) grow(minCapacity); // 扩容 } private void grow(int minCapacity) { 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); elementData = Arrays.copyOf(elementData, newCapacity); // 数组复制 }
ArrayList 在添加元素时会动态扩容,即当元素数量超过当前内部数组的容量时,会调用 grow()
方法进行容量的扩增。grow()
方法会根据原有容量计算出新的容量,并使用 Arrays.copyOf()
方法将原数组复制到新的数组中。
这是 ArrayList 的一些关键源码解析。它实现了动态数组,通过数组来存储元素,并提供了添加、获取和删除等操作。扩容机制保证了列表能够适应不断变化的元素数量。