ArrayList的add(E e)方法与扩容
ArrayList是Java開發中經常用到的集合類,它是List接口的實現類,具有很高的查詢性能,但不是線程安全的。本文主要講述了ArrayList的add(E e)方法及該方法中涉及到的容量擴容技術。
- 本文大綱
1.ArrayList底層數據結構
2.add(E e)方法流程概覽
3.add(E e)方法與擴容源碼分析
說明:本文對ArrayList的源碼分析是基于JDK8。
- 正文
1.ArrayList底層數據結構
ArrayList的底層數據結構為一個Object數組,對應到源碼中是:
transient Object[] elementData; // non-private to simplify nested class access2.add(E e)方法流程概覽
add(E e)方法的大致流程:
? ? ? ? ? ? ? ? ? ? ? ?
3.add(E e)方法與擴容源碼分析
接著再看一下源碼:
public boolean add(E e) {// 確保數組有足夠的空間來存儲對象eensureCapacityInternal(size + 1); // Increments modCount!!// 將對象e存放到數組的末尾elementData[size++] = e;return true; } ensureCapacityInternal方法主要是確保elementData數組有足夠的空間來存儲待添加的元素: // 參數minCapacity是add(E e)方法中調用ensureCapacityInternal方法時傳入的size + 1的值 private void ensureCapacityInternal(int minCapacity) {if (elementData == EMPTY_ELEMENTDATA) {minCapacity = Math.max(DEFAULT_CAPACITY, minCapacity);}ensureExplicitCapacity(minCapacity); }參數minCapacity是為了存放這個元素elementData數組所需要的最小的大小。比如,現在一個數組中存放了10個元素,再次向該數組存放一個元素時,那么這個minCapacity的值就是size + 1,即10 + 1 = 11。
private void ensureExplicitCapacity(int minCapacity) {modCount++;// overflow-conscious codeif (minCapacity - elementData.length > 0) // 存放新元素所需的最小容量大于elementData數組的長度 grow(minCapacity); }如果存放新元素所需的最小容量大于elementData數組的長度,即當前數組的容量不足,不能再存放新的元素,那么將基于elementData數組進行擴容。
private void grow(int minCapacity) {// overflow-conscious codeint oldCapacity = elementData.length;int newCapacity = oldCapacity + (oldCapacity >> 1); // 計算新數組的容量,新數組的容量為原數組容量的1.5倍數。>>是移位運算符,oldCapacity >> 1表示oldCapacity除以2if (newCapacity - minCapacity < 0) // 針對當創建的ArrayList的容量大小為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 }?
?當我們在new ArrayList的時候,如果指定ArrayList的容量大小為1(比如,new ArrayList<>(1)),再進行add(E e)操作,在執行代碼int newCapacity = oldCapacity + (oldCapacity >> 1)時,newCapacity的值為1,newCapacity與oldCapacity的值都為1,這樣其實并沒有進行擴容。if (newCapacity - minCapacity < 0)就是為避免這種情況,當newCapacity(此例中為1)的值小于minCapacity(此例中為2)時,就把minCapacity的值賦給newCapacity。
?
轉載于:https://www.cnblogs.com/pedlar/p/10165630.html
與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的ArrayList的add(E e)方法与扩容的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Windows -- cmd命令:
- 下一篇: 职场潜规则:领导常说的10句话,学会3句