先通过反射获取到原始的数据数组,查看他的大小
public class Demo {
public static void main(String[] args) throws Exception {
ArrayList<String> list = new ArrayList<>();
for (int i = 0; i < 1000; i++) {
list.add(""+i);
}
list.add("111");
Class<? extends ArrayList> claz = list.getClass();
Field fieldP = claz.getDeclaredField("elementData");
fieldP.setAccessible(true);
Object[] o = (Object[]) fieldP.get(list);
System.out.println(o.length);
}
}
通过打印可以得知每次添加的时候ArrayList不一定会扩容,所以查看源码查看原因
public boolean add(E e) {
// 检查是否需要扩容
ensureCapacityInternal(size + 1); // Increments modCount!!
elementData[size++] = e;
return true;
}
private void grow(int minCapacity) { // minCapacity就是size+1,也就是原始数据长度+1
// overflow-conscious code
int oldCapacity = elementData.length; // 原始数据长度
int newCapacity = oldCapacity + (oldCapacity >> 1); // 原始数据长度 + 原始数据的长度的一半,据说是用>>效率比除要高
if (newCapacity - minCapacity < 0) // 如果原始数据扩容一次后没有之前的容量大就不会进行扩容
newCapacity = minCapacity;
if (newCapacity - MAX_ARRAY_SIZE > 0)
newCapacity = hugeCapacity(minCapacity);
// minCapacity is usually close to size, so this is a win:
elementData = Arrays.copyOf(elementData, newCapacity);
}
举栗子:ArrayList的默认容量是10,现在加一个元素进去
minCapacity = 1;
oldCapacity = 0;
newCapacity = 0;
newCapacity - minCapacity < 0;就不进行扩容