ArrayList的特點及應用場景
一、ArrayList核心特點
-
基于動態數組實現
-
底層使用Object[]數組存儲元素
-
默認初始容量為10
-
擴容機制:每次擴容為原來的1.5倍(
int newCapacity = oldCapacity + (oldCapacity >> 1)
)
-
-
快速隨機訪問
-
實現了RandomAccess接口(標記接口)
-
通過索引訪問元素的時間復雜度為O(1)
-
-
有序可重復
-
保持插入順序
-
允許存儲重復元素和null值
-
-
非線程安全
-
多線程環境下需要外部同步
-
可以使用
Collections.synchronizedList
包裝
-
-
插入刪除效率
-
尾部操作:O(1)
-
中間操作:O(n)(需要移動元素)
-
二、與LinkedList對比
特性 | ArrayList | LinkedList |
---|---|---|
底層結構 | 動態數組 | 雙向鏈表 |
隨機訪問 | O(1) | O(n) |
頭部插入/刪除 | O(n) | O(1) |
尾部插入/刪除 | O(1) | O(1) |
內存占用 | 較小(僅存儲實際元素) | 較大(需要存儲前后節點引用) |
三、典型應用場景
-
適合使用ArrayList的場景
-
頻繁訪問元素(按索引讀取)
// 數據查詢業務 List<Product> productList = new ArrayList<>(); Product p = productList.get(5); // 高效隨機訪問
-
尾部頻繁添加/刪除
// 日志記錄收集 List<Log> logs = new ArrayList<>(); logs.add(newLog); // 尾部添加高效
-
數據量可預估且變化不大
// 初始化時指定容量避免擴容 List<String> fixedSizeList = new ArrayList<>(1000);
-
-
不適合使用ArrayList的場景
-
頻繁在列表中間插入/刪除
-
內存空間非常緊張的情況
-
需要線程安全但未做同步處理
-
四、最佳實踐建議
-
初始化指定容量(如果可以預估大小)
// 避免多次擴容 List<User> users = new ArrayList<>(expectedSize);
-
批量操作使用addAll
// 比循環add更高效 list.addAll(anotherCollection);
-
遍歷方式選擇
// 隨機訪問結構推薦使用for循環 for (int i = 0; i < list.size(); i++) {Item item = list.get(i); }// 或者使用迭代器 for (Item item : list) {// ... }
-
注意并發修改
// 多線程環境需要同步 List<String> syncList = Collections.synchronizedList(new ArrayList<>());
ArrayList因其出色的隨機訪問性能和空間效率,成為Java中最常用的集合類之一,特別適合"讀多寫少"和"尾部操作多"的場景。