// Shared empty array instance used for empty instances. privatestaticfinal Object[] EMPTY_ELEMENTDATA = {};
// Shared empty array instance used for default sized empty instances. // We distinguish this from EMPTY_ELEMENTDATA to know how much to inflate when first element is added. // 用来区分扩容方式 privatestaticfinal Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};
publicArrayList(int initialCapacity) { // .... if (initialCapacity == 0) { this.elementData = EMPTY_ELEMENTDATA; } } publicArrayList() { this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA; } privatevoidensureCapacityInternal(int minCapacity) {//minCapacity=size+1 ensureExplicitCapacity(calculateCapacity(elementData, minCapacity)); } privatestaticintcalculateCapacity(Object[] elementData, int minCapacity) { if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) { return Math.max(DEFAULT_CAPACITY, minCapacity);// 无参构造初始化为10 } return minCapacity; } // privatevoidensureExplicitCapacity(int minCapacity) { modCount++; // overflow-conscious code if (minCapacity - elementData.length > 0) grow(minCapacity); } privatevoidgrow(int minCapacity) {//扩容 // overflow-conscious code intoldCapacity= elementData.length; intnewCapacity= 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); }
after i=0, list capacity:1 after i=1, list capacity:2 after i=2, list capacity:3 after i=3, list capacity:4 after i=4, list capacity:6 after i=6, list capacity:9 after i=9, list capacity:13 after i=13, list capacity:19 after i=19, list capacity:28 after i=28, list capacity:42 after i=42, list capacity:63 after i=63, list capacity:94 after i=94, list capacity:141
ArrayList()无参扩容:
1 2 3 4 5 6 7
after i=0, list capacity:10 after i=10, list capacity:15 after i=15, list capacity:22 after i=22, list capacity:33 after i=33, list capacity:49 after i=49, list capacity:73 after i=73, list capacity:109