首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 綜合教學

Java 集合框架深度解析:ArrayList 擴容機制、性能特點與最佳實踐

     編輯:Java 綜合教學

Java 集合框架深度解析:ArrayList 擴容機制、性能特點與最佳實踐

核心定義解讀

public class ArrayList<E> extends AbstractList<E> 
    implements List<E>, RandomAccess, Cloneable, Serializable {
    private static final int DEFAULT_CAPACITY = 10;
    private static final Object[] EMPTY_ELEMENTDATA = {};
    transient Object[] elementData; // 底層數組
}

關鍵信息:

  1. 實現 RandomAccess → 隨機訪問 (get) 極快
  2. 實現 Cloneable/Serializable → 支持克隆/序列化 (淺拷貝)
  3. 底層 動態數組,默認初始容量 10

擴容機制

新容量 = oldCapacity * 3/2 + 1 (約 1.5 倍)。折中空間與時間:避免頻繁擴容或過度浪費。

底層調用 Arrays.copyOf() 進行數組拷貝。

增刪操作流程

  • 刪除:① 移除指定位置元素 ② 後續元素前移一位 (數組拷貝) ③ 最後位置置 null 利於 GC
  • 插入:類似,後續元素後移一位

優缺點總結

優點缺點
隨機訪問 O(1) 極快中間/頭部插入刪除 O(n) 需大量拷貝
順序添加 (尾部) O(1) 摩擦頻繁擴容有性能開銷
內存連續,CPU 緩存友好非線程安全

適用場景: 順序添加、隨機訪問多、插入刪除少。
LinkedList 適用: 頻繁頭部/中間插入刪除。
注:尾部操作 ArrayList 反而比 LinkedList 快 (無節點創建開銷)。

最佳實踐技巧

  1. 線程安全包裝:
    List<String> list = Collections.synchronizedList(new ArrayList<>());
  2. 遍歷方式選擇:
    if (list instanceof RandomAccess) {
        for (int i = 0; i < list.size(); i++) { ... } // 普通 for 循環,快 2 倍
    } else {
        for (Iterator it = list.iterator(); it.hasNext(); ) { ... } // 迭代器
    }

    ArrayList 用普通 for,LinkedList 用迭代器 (普通 for 會慢上千倍)。

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