Arrays.asList(...) 返回的是 **java.util.Arrays.ArrayList**(內部類),**非** java.util.ArrayList。它是對原始陣列的**視圖包裝**,特性:
add()/remove()(拋 UnsupportedOperationException)get()/set()/contains()/iterator()RandomAccess、Serializablepublic static <T> List<T> asList(T... a)
返回受指定陣列支援的**固定大小列表**。對返回列表的修改會「直寫」到陣列。此方法在陣列 API 與 Collection API 間架起橋樑。
import java.util.*;
public class AsListDemo {
public static void main(String[] args) {
String[] arr = {"Larry", "Moe", "Curly"};
List list = Arrays.asList(arr);
System.out.println("原始列表: " + list); // [Larry, Moe, Curly]
System.out.println("實際類別: " + list.getClass().getName()); // java.util.Arrays$ArrayList
// ✅ 允許:修改元素值
list.set(1, "Moe Modified");
System.out.println("修改後列表: " + list); // [Larry, Moe Modified, Curly]
System.out.println("原陣列同步變化: " + Arrays.toString(arr)); // [Larry, Moe Modified, Curly]
// ❌ 禁止:改變長度
try {
list.add("Shemp"); // UnsupportedOperationException
} catch (UnsupportedOperationException e) {
System.out.println("add() 失敗: " + e.getMessage());
}
try {
list.remove(0); // UnsupportedOperationException
} catch (UnsupportedOperationException e) {
System.out.println("remove() 失敗: " + e.getMessage());
}
}
}
| 場景 | 錯誤寫法 | 正確寫法 |
|---|---|---|
| 需要可變長度 List | List | List |
| 僅需遍歷/查詢 | 無 | 直接用 Arrays.asList(),零拷貝、效能最優 |
| 基本型別陣列 | Arrays.asList(new int[]{1,2,3}) → 返回 List(單一元素) | 用 IntStream.of(arr).boxed().collect(Collectors.toList()) 或手動裝箱 |
在 .NET 中,陣列與 List 皆實作 IList 介面,透過介面訪問陣列時行為與 Arrays.asList() 類似:固定大小、可修改元素值。Java 選擇以專用內部類實現,設計意圖相同。
List stooges = Arrays.asList("Larry", "Moe", "Curly"); Collection/List 參數的 API(不修改長度)Collection.toArray() ↔ Arrays.asList()Arrays.asList() 是陣列的「唯讀視圖」,而非獨立集合。理解其固定長度、共享底層陣列的本質,避免誤調 add/remove,需要可變列表時請顯式拷貝至 new ArrayList<>()。正確使用能減少物件創建、提升效能。