千锋教育Java入门全套视频教程(java核心技术,适合java零基础,Java
2023-07-24 11:03 作者:bili_12581762483 | 我要投稿

ArrayList 底层是一个object数组elementData 存储元素
无参构造this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;将里面的数组赋值成一个空数组
add()方法
public boolean add(E e) { ensureCapacityInternal(size + 1); //size 实际集合存储元素的个数 elementData[size++] = e;//存储元素 return true; } private void ensureCapacityInternal(int minCapacity) { ensureExplicitCapacity(calculateCapacity(elementData, minCapacity));//calculateCapacity计算集合容量 } private static int calculateCapacity(Object[] elementData, int minCapacity) { if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) { return Math.max(DEFAULT_CAPACITY, minCapacity);//如果集合是空数组 ,返回 默认最小的集合长度10与实际需要的集合长度size+1的较大值 } return minCapacity;//不是空集合,就返回size+1 } private void ensureExplicitCapacity(int minCapacity) { modCount++; // overflow-conscious code if (minCapacity - elementData.length > 0) grow(minCapacity);//如果计算的长度大于集合的长度,就扩容,grow扩容集合长度 } private void grow(int minCapacity) { // overflow-conscious code int oldCapacity = elementData.length; int newCapacity = oldCapacity + (oldCapacity >> 1);//集合长度的1.5倍 if (newCapacity - minCapacity < 0)//如果新长度小于size+1 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);//数组拷贝,将原先数组内容拷贝到新长度的数组,再将新数组的地址赋给elementData }
结论:第一次添加数据的时候,数组扩容为10,以后每次扩容的时候长度为原本数组长度的1.5倍
带参的构造可以指定数组的长度,以后再添加数据的时候避免频繁的扩容