ArrayList<E> extends AbstractList<E> implements List<E>, RandomAccess, Cloneable, java.io.Serializable
ArrayList继承自AbstractList,这和Vector是一样的,实现了List接口,所以兼具两者的方法。
ArrayList<Integer> list = new ArrayList<>();
当我们new一个无参数的对象时,此时初始化一个空数组,并不是初始化一个长度为10的数组
public ArrayList() {
this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA; // DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {}
}
接下来我们看看add方法
public boolean add(E e) {
ensureCapacityInternal(size + 1); // Increments modCount!首先确保数组的长度足够使用,元素的个数小于数组的长度
elementData[size++] = e;
return true;
}
我们看看ensureCapacityInternal做了什么,初始化的 size=0
private void ensureCapacityInternal(int minCapacity) { // minCapacity=0 elementData实际的数组数据 ensureExplicitCapacity(calculateCapacity(elementData, minCapacity)); }
在看ensureExplicitCapacity做了什么之前先看看calculateCapacity做了什么
private static int calculateCapacity(Object[] elementData, int minCapacity) { // minCapacity=0 if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) { // elementData 第一次调用时为空{} return Math.max(DEFAULT_CAPACITY, minCapacity); } return minCapacity; }
上面的方法可以看出返回了一个新的int类型的数字,而这个数字就是默认的10;
接下来的调用
private void ensureExplicitCapacity(int minCapacity) { modCount++; // overflow-conscious code if (minCapacity - elementData.length > 0) grow(minCapacity); }
private void grow(int minCapacity) { // 扩容 // 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); // 把原来数组里的数组复制到新的数组里面 }
private static int hugeCapacity(int minCapacity) { // 巨大空间 返回Integer的最大值 if (minCapacity < 0) // overflow throw new OutOfMemoryError(); return (minCapacity > MAX_ARRAY_SIZE) ? Integer.MAX_VALUE : MAX_ARRAY_SIZE; }
至此,ArrayList的添加数据的过程接结束了。
ArrayList里面的数组的长度对外是不公开的,也就是你无法通过其他办法获取存储数据的数组的长度,size()方法只能获取已经存的数据的个数。
该文章以后还会继续更新。