首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

ArrayList 動態擴容機制深度解析

     編輯:程式設計疑難解答

核心觀念

Java ArrayList 底層以陣列儲存元素,陣列長度固定。當加入元素超過容量時,ArrayList 會自動建立更大的新陣列,並將舊資料複製過去,這就是「動態擴容」的本質。

擴容核心原始碼 (JDK 8)

private void grow(int minCapacity) {
    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);
    elementData = Arrays.copyOf(elementData, newCapacity);
}

關鍵細節解讀

步驟說明
1. 計算新容量預設為舊容量的 1.5 倍(oldCapacity + oldCapacity/2)。
2. 邊界檢查若 1.5 倍仍不夠,直接用所需最小容量;若超過 MAX_ARRAY_SIZE (Integer.MAX_VALUE - 8),則呼叫 hugeCapacity 處理。
3. 複製陣列呼叫 Arrays.copyOf,底層為 System.arraycopy,屬淺層複製。

效能影響與最佳實務

  • 時間複雜度:單次擴容為 O(n),但攤還分析下 add 平均 O(1)。
  • 預估大小:若能預估資料筆數,建議用 new ArrayList<>(initialCapacity) 減少擴容次數。
  • trimToSize():資料固定後可呼叫此方法縮減容量至實際大小,釋放記憶體。

結語

ArrayList 的「動態」是靠陣列複製實現的假象。理解擴容機制有助於寫出高效能的 Java 程式碼,避免頻繁擴容造成的 GC 壓力。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved