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

Java 集合框架深度解析:ArrayList 核心原理、擴容機制與遍歷方式全攻略

     編輯:Java 相關知識

為什麼需要 ArrayList?

陣列長度固定、類型固定、插入刪除困難。ArrayList 提供動態陣列能力:自動擴容、泛型型別安全、豐富操作 API。

繼承體系與介面實作

java.lang.Object
  ↓ java.util.AbstractCollection<E>
    ↓ java.util.AbstractList<E>
      ↓ java.util.ArrayList<E>

實作介面:Serializable, Cloneable, Iterable<E>, Collection<E>, List<E>, RandomAccess
直接子類:AttributeList, RoleList, RoleUnresolvedList

關鍵介面含義

  • RandomAccess:標記支援快速隨機存取 (O(1) get/set)
  • Serializable:支援序列化傳輸
  • Cloneable:支援淺層複製

三種建構子

new ArrayList()                    // 預設容量 10
new ArrayList(20)                  // 指定初始容量
new ArrayList(collection)          // 從集合複製元素

核心原理:動態擴容機制

// JDK 8 核心擴容邏輯 (grow 方法)
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);
}

擴容關鍵點

  • 預設初始容量 10,首次添加才分配陣列 (JDK 8+ 延遲初始化)
  • 擴容因子 1.5 倍 (old + old/2)
  • Arrays.copyOf 為 Native 實作,效能極高
  • 頻繁擴容有效能成本,預估資料量時建議指定初始容量

五種遍歷方式效能對比

方式程式碼效能適用場景
for 索引for(int i=0;i<size;i++) list.get(i)⭐⭐⭐⭐⭐ 最快高效能、需索引、隨機存取
增強 forfor(E e : list)⭐⭐⭐⭐ 簡潔唯讀遍歷、無需索引
Iteratorfor(Iterator it=list.iterator();it.hasNext();)⭐⭐⭐ 安全遍歷中需移除元素
ListIteratorfor(ListIterator it=list.listIterator();it.hasNext();)⭐⭐⭐ 雙向需逆向遍歷、修改、定位
forEach (Java 8)list.forEach(e -> ...)⭐⭐⭐ 函數式配合 Lambda、串流操作

常用方法實戰速查

List<String> list = new ArrayList<>();

// 新增
list.add("A");           // 尾部新增
list.add(1, "B");        // 指定位置插入
list.addAll(otherList);  // 批量新增

// 查詢
String first = list.get(0);
int idx = list.indexOf("A");
boolean has = list.contains("A");

// 修改
list.set(0, "NEW");      // 替換指定位置

// 刪除
list.remove(0);          // 按索引刪除
list.remove("A");        // 按物件刪除 (首個)
list.clear();            // 清空

// 截取視圖 (共享底層陣列,謹慎使用)
List<String> sub = list.subList(1, 3);

// 轉陣列
String[] arr = list.toArray(new String[0]); // 推薦寫法

// 容量管理
list.ensureCapacity(100); // 確保最小容量
list.trimToSize();        // 縮減容量至 size

ArrayList vs LinkedList 選擇指南

操作ArrayListLinkedList
隨機存取 get/setO(1) ⭐O(n)
尾部新增O(1) 攤銷O(1)
頭部/中間插入刪除O(n) 陣列搬移O(1) 定位後
記憶體開銷低 (陣列)高 (節點物件)
遍歷效能極佳 (CPU 緩存友好)較差 (指針跳躍)

90% 場景首選 ArrayList,除非明確需要頻繁頭部/中間插入刪除且不需隨機存取。

執行緒安全說明

  • ArrayList 非執行緒安全
  • 多執行緒環境:Collections.synchronizedList()、CopyOnWriteArrayList (讀多寫少)、或外部同步
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved