ArrayList 源码
1,查看初始化方法
2,给数组对象初始化
3,查看add(E)处理
4,ensureCapacityInternal() 这个方法主要是处理数组的动态扩容
5,calculateCapacity() 主要是数组的长度
6,判断数组是否是初始化的对象, 如果是,在判断是默认的长度大,还是数组的长度大,采用最大的值作为数组的长度
如果不是初始化的对象,那么直接返回当前长度。
7,判断数组是否需要动态扩容的方法
8,判断当前的length - arrayList对象的length 是否大于 0
大于0 说明需要扩容
小于等于0不处理
9,grow() 数组扩容的处理方法
10,Arrays.cooyOf()扩容数组
private void grow(int minCapacity) {
// overflow-conscious code
// oldCapacity 就是 当前数组的 length
// 比如 oldCapacity 是16
int oldCapacity = elementData.length;
// newCapacity = oldCapacity + (oldCapacity * 0.5)
// 24 = 16 + (16 * 0.5)
int newCapacity = oldCapacity + (oldCapacity >> 1);
// 判断 新的长度 - 当前长度 < 0 就继续使用当前长度
if (newCapacity - minCapacity < 0)
newCapacity = minCapacity;
// 判断 新长度 - 数组最大长度 > 0 就使用 int 的最大值 否则 使用 MAX_ARRAY_SIZE的值
if (newCapacity - MAX_ARRAY_SIZE > 0)
newCapacity = hugeCapacity(minCapacity);
// minCapacity is usually close to size, so this is a win:
// copy 原数组生成新数组
elementData = Arrays.copyOf(elementData, newCapacity);
}
// original 原数组
// newLength 新数组长度
public static <T> T[] copyOf(T[] original, int newLength) {
return (T[]) copyOf(original, newLength, original.getClass());
}
public static <T,U> T[] copyOf(U[] original, int newLength, Class<? extends T[]> newType) {
@SuppressWarnings("unchecked")
// 判断泛型是不是 Object 对象
// 是的 Object 的情况下通过 new Object[length] 构建新数组
// 不是的情况下通过 getComponentType() 获取数组对象的数据类型, 新数组长度构建数组
// int[].getComponentType() == 'int'
T[] copy = ((Object)newType == (Object)Object[].class)
? (T[]) new Object[newLength]
: (T[]) Array.newInstance(newType.getComponentType(), newLength);
// 原数组 开始复制下标 新数组 复制值的下标 复制数组长度
System.arraycopy(original, 0, copy, 0,
Math.min(original.length, newLength));
return copy;
}