在 Java 集合框架中,ArrayList 是一个灵活且常用的类,本文将深入探讨 Java 中 ArrayList 的 add 方法,这是我们向 ArrayList 中添加元素的主要方式。
ArrayList 集合中的add(E)方法,其处理过程概括如下。
如果集合中还有多余索引位可以存储数据对象,那么直接在数组最后一个有效索引位的下一个索引位上添加新数据对象;如果集合中没有多余的索引位可以存储数据对象,那么先进行扩容操作,再进行新数据对象的添加操作。
ArrayList 集合中的add(E)方法的相关源码片段如下。
public boolean add(E e) {
// 检查数组容量大小,如果容量不够,进行扩容
ensureCapacityInternal(size + 1); // Increments modCount!!
// 在数组的最后一个有效索引位的下一个索引位上添加新数据对象
elementData[size++] = e;
return true;
}
// 检查数据容量的代码
private void ensureExplicitCapacity(int minCapacity) {
// 这是一个用于快速失败机制的版本号,用于迭代器检测列表在迭代过程中是否被修改。
modCount++;
// overflow-conscious code
if (minCapacity - elementData.length > 0)
grow(minCapacity);
}
add(int, E)方法和add(E)方法的工作差异在arraycopy()方法处才显现出来,具体来说,add(int, E)方法可以使用arraycopy()方法将数据对象的添加操作和指定索引位上数据对象的移位操作一次性处理完。
public void add(int index, E element) {
// 检查索引位是否合理
rangeCheckForAdd(index);
// 检查数组容量大小,如果容量不够,进行扩容
ensureCapacityInternal(size + 1); // Increments modCount!!
// 添加数据的位置的数据全部后移一个位置
System.arraycopy(elementData, index, elementData, index + 1,
size - index);
// 将新元素添加到指定索引位置
elementData[index] = element;
// 数组容量 +1
size++;
}
ArrayList 的 add 方法是日常编程中非常常用的功能,它背后的扩容机制确保了 ArrayList 可以动态地适应元素数量的变化。理解 add 方法和扩容机制对于我们合理使用 ArrayList 以及优化程序性能至关重要。