ArrayList的擴容方式和擴容時機
阿新 • • 發佈:2018-12-19
初始化
ArrayList的底層是一個動態陣列,ArrayList首先會對傳進來的初始化引數initalCapacity進行判斷
- 如果引數等於0,則將陣列初始化為一個空陣列,
- 如果不等於0,將陣列初始化為一個容量為10的陣列。
擴容時機
當陣列的大小大於初始容量的時候(比如初始為10,當新增第11個元素的時候),就會進行擴容,新的容量為舊的容量的1.5倍。
擴容方式
擴容的時候,會以新的容量建一個原陣列的拷貝,修改原陣列,指向這個新陣列,原陣列被拋棄,會被GC回收。
//ArraList初始化容量判斷 public void ensureCapacity(int minCapacity) { int minExpand = (elementData != DEFAULTCAPACITY_EMPTY_ELEMENTDATA) ? 0 : DEFAULT_CAPACITY; if (minCapacity > minExpand) { ensureExplicitCapacity(minCapacity); } } //新增元素的方法 public boolean add(E e) { ensureCapacityInternal(size + 1); // Increments modCount!! elementData[size++] = e; return true; } //判斷是否需要擴容 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); }