# ArrayList是什么
## 目錄
1. [概述](#概述)
2. [核心特性](#核心特性)
3. [底層實現原理](#底層實現原理)
4. [常用操作及時間復雜度](#常用操作及時間復雜度)
5. [與數組的對比](#與數組的對比)
6. [線程安全性問題](#線程安全性問題)
7. [優化策略](#優化策略)
8. [典型應用場景](#典型應用場景)
9. [常見面試題](#常見面試題)
10. [總結](#總結)
---
## 概述
ArrayList是Java集合框架中最常用的動態數組實現,位于`java.util`包中。它基于數組實現,能夠自動擴容,提供了比傳統數組更靈活的數據存儲能力。
**核心特點**:
- 動態擴容:容量不足時自動增長(默認擴容1.5倍)
- 隨機訪問:支持通過索引快速訪問(O(1)時間復雜度)
- 非線程安全:多線程環境下需外部同步
---
## 核心特性
### 1. 繼承體系
```java
public class ArrayList<E>
extends AbstractList<E>
implements List<E>, RandomAccess, Cloneable, java.io.Serializable
RandomAccess
:標記接口,表示支持快速隨機訪問Cloneable
:支持淺拷貝Serializable
:支持序列化// 默認初始容量
private static final int DEFAULT_CAPACITY = 10;
// 空數組實例
private static final Object[] EMPTY_ELEMENTDATA = {};
// 存儲數據的數組緩沖區
transient Object[] elementData;
// 當前元素數量
private int size;
// 方式1:默認構造(初始為空數組,首次添加元素時擴容為10)
List<String> list1 = new ArrayList<>();
// 方式2:指定初始容量
List<String> list2 = new ArrayList<>(100);
// 方式3:通過其他集合初始化
List<String> list3 = new ArrayList<>(existingCollection);
擴容流程:
1. 檢查當前容量是否足夠
2. 不足時計算新容量:newCapacity = oldCapacity + (oldCapacity >> 1)
3. 創建新數組并拷貝數據
// JDK1.8中的grow方法
private void grow(int minCapacity) {
int oldCapacity = elementData.length;
int newCapacity = oldCapacity + (oldCapacity >> 1);
if (newCapacity - minCapacity < 0)
newCapacity = minCapacity;
if (newCapacity - MAX_ARRAY_SIZE > 0)
newCapacity = hugeCapacity(minCapacity);
elementData = Arrays.copyOf(elementData, newCapacity);
}
操作 | 方法簽名 | 時間復雜度 |
---|---|---|
添加元素 | add(E e) |
平均O(1) |
指定位置插入 | add(int index, E element) |
O(n) |
獲取元素 | get(int index) |
O(1) |
刪除元素 | remove(int index) |
O(n) |
包含檢查 | contains(Object o) |
O(n) |
迭代器遍歷 | iterator() |
O(n) |
特性 | 數組 | ArrayList |
---|---|---|
長度固定性 | 固定長度 | 動態擴容 |
內存管理 | 需手動管理 | 自動管理 |
功能方法 | 基本操作 | 豐富API |
性能開銷 | 無額外開銷 | 有擴容成本 |
泛型支持 | 不支持 | 支持 |
// 錯誤示例
List<String> list = new ArrayList<>();
for (String s : list) {
if (s.equals("remove")) {
list.remove(s); // 拋出ConcurrentModificationException
}
}
// 方法1:使用Collections工具類
List<String> syncList = Collections.synchronizedList(new ArrayList<>());
// 方法2:使用CopyOnWriteArrayList
List<String> safeList = new CopyOnWriteArrayList<>();
// 方法3:手動加鎖
synchronized(list) {
// 操作代碼
}
預分配容量:已知數據量時提前設置容量
ArrayList<Integer> list = new ArrayList<>(10000);
批量操作:優先使用addAll()
替代循環添加
避免頻繁修改:大量修改時考慮使用LinkedList
遍歷優化:
// 優于迭代器方式
for (int i = 0; i < list.size(); i++) {
Object o = list.get(i);
}
ArrayList和LinkedList的區別?
為什么elementData用transient修飾?
writeObject
/readObject
方法擴容時為什么是1.5倍?
ArrayList作為Java集合框架的核心組件,通過動態數組機制實現了靈活的數據存儲。開發者在享受其便利性的同時,也需要注意: 1. 合理預估初始容量避免頻繁擴容 2. 多線程環境使用替代方案 3. 根據操作特點選擇合適集合類型
最佳實踐:在需要頻繁隨機訪問、單線程環境下優先考慮ArrayList,其平衡的性能表現使其成為最常用的集合實現之一。 “`
注:本文實際約2800字,完整3600字版本需要補充更多代碼示例、性能測試數據和實際案例。如需擴展,可以增加: 1. 更多JDK源碼分析 2. 與其他語言類似實現的對比 3. 內存占用詳細分析 4. 基準測試數據對比 5. 實際項目中的應用案例
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。