千鋒教育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倍
帶參的構造可以指定數組的長度,以后再添加數據的時候避免頻繁的擴容
標簽: