ArrayList类的add方法
当前版本为jdk1.8.0_102
一、使用时共有三种情况:
1、 0<=size<length 即正常添加数据
将元素放置到elementData[size]
2、 size == 0 即第一次添加数据
第一次添加数据时利用初始长度右移仍未0这一特点,将数组扩容到10。
3、 length<size 即当元素个数超出数组范围时添加
对当前元素个数进行判断,如果其大于数组长度则扩容,反之不扩容。
扩容使用Arrays.copyOf()方法将原数组进行复制,此方法底层实现速度为o(n)。
(时间复杂度速度百度的来,未验证)
二、相关程序:
//静态常量
private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};
private static final int DEFAULT_CAPACITY = 10;
private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8;
//数组变量
private int size; //数组元素个数
transient Object[] elementData;//数组引用
public boolean add(E e) {
//传递当前元素个数
ensureCapacityInternal(size + 1);
//数组赋值
elementData[size++] = e;
return true;
}
private void ensureCapacityInternal(int minCapacity) {
//处理数组为空的情况,
//如果为空则将minCapacity置为10,此时minCapacity大于0超出元素个数
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;
//计算新数组的长度,其值为原数组的1.5倍。
int newCapacity = oldCapacity + (oldCapacity >> 1);
//数组为空时,将数组扩容到10。
if (newCapacity - minCapacity < 0)
newCapacity = minCapacity;
//检查数组长度是否达到最大值
if (newCapacity - MAX_ARRAY_SIZE > 0)
newCapacity = hugeCapacity(minCapacity);
//复制原数组至新数组
elementData = Arrays.copyOf(elementData, newCapacity);
}