概述
底层通过数组实现,所以 查询/更新效率很高,删除/增加跟位置相关,除未实现同步外和 Vector 大致相同
扩容
public boolean add(E e) {
// 数组扩容,不是一定要扩容,需要扩容才扩容
// 初始化 ArrayList 时如果不指定长度或者指定长度为0,size 就是 0(属性 size 是 int,默认值是0)
ensureCapacityInternal(size + 1);
// 数组最后一个位置存放新增的元素(elementData是底层存放数据的数组)
elementData[size++] = e;
return true;
}
// 扩容方法具体逻辑(minCapacity 是 size+1)
private void ensureCapacityInternal(int minCapacity) {
// calculateCapacity(elementData, minCapacity):确定数组添加元素后的真实长度
// ensureExplicitCapacity():1,记录 list 修改次数;2,添加元素后是否扩容
ensureExplicitCapacity(calculateCapacity(elementData, minCapacity));
}
// 确定数组添加元素后真实长度逻辑
private static int calculateCapacity(Object[] elementData, int minCapacity) {
// 初始化 ArrayList 没有指定长度或指定长度是0时 elementData 就等于 DEFAULTCAPACITY_EMPTY_ELEMENTDATA(构造方法)
if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {
// 如果初始化时没有指定长度或长度是0时,size 是 0,minCapacity = size+1,所以 minCapacity 就是1
// DEFAULT_CAPACITY 是 10,两者取其大作为 数组长度
return Math.max(DEFAULT_CAPACITY, minCapacity);
}
// 如果初始化时指定了长度,那么就是 size+1 为数组长度
return minCapacity;
}
// 真正的扩容处理
private void ensureExplicitCapacity(int minCapacity) {
modCount++; // 记录修改次数
// 如果新的长度大于原来的长度就扩容
if (minCapacity - elementData.length > 0)
// 进入这里就表明需要扩容了(大约原来的长度1.5倍):1,复制一个新的数组;2,更新 size(然后回到 add() 方法中把元素放在数组末尾)
grow(minCapacity);
}
标签:扩容,java,elementData,List,minCapacity,数组,长度,源码,size
From: https://www.cnblogs.com/hangychn/p/17168994.html