ArrayList 與 Vector 是 Java 集合框架中最基礎、使用頻率最高的兩個 List 實作。雖然兩者底層皆為動態陣列,但在 API 設計、執行緒安全性與現代最佳實踐上存在顯著差異。本文通過實戰代碼示範,幫助你快速掌握核心用法並避開常見坑點。
add(E e) / add(int index, E element):尾部追加 / 指定位置插入get(int index):隨機存取,O(1)set(int index, E element):替換指定位置元素remove(int index) / remove(Object o):刪除indexOf / lastIndexOf:查找首尾位置listIterator():雙向疊代器,支援增刪改查toArray():轉為陣列import java.util.*;
public class ArrayListDemo {
public static void main(String[] args) {
List<String> list = new ArrayList<>();
// 1. 添加元素
list.add("福娃0");
list.add("福娃1");
list.add("福娃2");
// 2. 指定位置插入
list.add(1, "後添加的福娃"); // 索引 1 處插入,後續元素右移
// 3. 遍歷輸出(推薦 for-each 或 Iterator)
System.out.println("=== 迭代器遍歷 ===");
Iterator<String> it = list.iterator();
while (it.hasNext()) {
System.out.println(it.next());
}
// 4. 隨機存取
System.out.println("\n=== 隨機存取 ===");
System.out.println("索引 2 的元素:" + list.get(2));
// 5. 修改元素
list.set(0, "新福娃0");
// 6. 轉陣列
String[] arr = list.toArray(new String[0]);
System.out.println("\n轉陣列長度:" + arr.length);
}
}
輸出結果:
=== 迭代器遍歷 ===
新福娃0
後添加的福娃
福娃1
福娃2
=== 隨機存取 ===
索引 2 的元素:福娃1
轉陣列長度:4
addElement(E obj) / insertElementAt(E obj, int index):同 addelementAt(int index):同 getsetElementAt(E obj, int index):同 setremoveElementAt(int index):同 removecapacity():查看當前陣列容量(非 size)import java.util.Vector;
public class VectorDemo {
public static void main(String[] args) {
Vector<String> v = new Vector<>();
// 添加元素
v.addElement("福娃0");
v.addElement("福娃1");
v.addElement("福娃2");
// 刪除索引 1 的元素
v.removeElementAt(1);
// 遍歷(傳統 for 迴圈配合 elementAt)
System.out.println("=== Vector 遍歷 ===");
for (int i = 0; i < v.size(); i++) {
System.out.println(i + ": " + v.elementAt(i));
}
// 查看容量 vs 大小
System.out.println("\nSize: " + v.size() + ", Capacity: " + v.capacity());
}
}
輸出結果:
=== Vector 遍歷 ===
0: 福娃0
1: 福娃2
Size: 2, Capacity: 10
| 維度 | ArrayList | Vector |
|---|---|---|
| 同步機制 | 非同步,效能高 | 方法級 synchronized,效能低 |
| 擴容倍數 | 1.5 倍 | 2 倍 |
| API 風格 | 符合 Collections 框架標準 | 保留舊式 Enumeration、elementAt 等 |
| 疊代器 | fail-fast | fail-fast(同步塊中需手動同步疊代) |
| 現代替代 | 單執行緒首選 | 用 Collections.synchronizedList 或 CopyOnWriteArrayList |
CopyOnWriteArrayListCollections.synchronizedList(new ArrayList<>()) 並手動同步疊代塊new ArrayList<>(預估大小) 減少擴容開銷。List<String> list = new ArrayList<>(); 便於後續替換實作。synchronized(list) 塊中進行,或使用並發安全容器。ArrayList 是現代 Java 開發中 List 的事實標準實作,效能優異、API 乾淨;Vector 因歷史包袱與同步開銷,已淡出主流新建專案。掌握兩者核心 API、擴容機制與同步差異,能幫助你在效能與正確性間做出正確選擇。