ArrayList 原始碼解析<一>
阿新 • • 發佈:2020-12-14
技術標籤:java
Arraylist ,是我們平常使用非常頻繁的一個集合,我們從最常用的方式 開始解析
ArrayList<String> arrlist1 = new ArrayList();
arrlist1.add("1");
arrlist1.add("2");
...
...
...
以此增加11個元素
...
...
arrlist1.add("10");
arrlist1.add("11");
ArrayList<String> arrlist1 = new ArrayList();初始化物件,呼叫了為空的建構函式,我們來看一下簡化的原始碼。
public class ArrayList<E> extends AbstractList<E> implements List<E>, RandomAccess, Cloneable, java.io.Serializable { /** * 預設的初始化容量 為10 */ private static final int DEFAULT_CAPACITY = 10; /** * 預設初始化容量的陣列是一個長度為0的空陣列 */ private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {}; /** * ArrayList元素儲存到的陣列緩衝區。 */ transient Object[] elementData; // non-private to simplify nested class access private int size;//Arraylist陣列長度 /** * new ArrayList(),初始化空建構函式時,ArrayList的元素陣列 為 預設初始化容量的陣列是一個長度為0的空陣列 */ public ArrayList() { this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA; } /** * 陣列長度 是在add的時候才開始初始和擴容 */ public boolean add(E e) { ensureCapacityInternal(size + 1); // 擴容陣列長度 elementData[size++] = e;//開始新增元素到陣列 return true; } /** * 保證陣列長度夠新增元素 */ private void ensureCapacityInternal(int minCapacity) { ensureExplicitCapacity(calculateCapacity(elementData, minCapacity)); } /** 計算擴容容量 */ private static int calculateCapacity(Object[] elementData, int minCapacity) { //陣列元素是 預設容量的空陣列 if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) { //DEFAULT_CAPACITY 與當前size比較,size 小與預設陣列長度10 時,返回預設陣列長 //度,否則返回 size return Math.max(DEFAULT_CAPACITY, minCapacity); } return minCapacity; } 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);//擴容大小為原來陣列長度的1.5倍 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); } }
總結:new Arraylist()方式初始化
1 初始化時 預設一個空陣列
2 add的時候去初始化預設容量10 的陣列
3 陣列長度超過10的時候,擴容為原來陣列長度的1.5倍