public class Ques1014 {
public static void main(String[] args) {
int[] data = {1, 2, 3};
List list = Arrays.asList(data);
System.out.println("列表的元素數量是:" + list.size());
}
}
問題:主程序輸出結果是多少?
輸出:列表的元素數量是:1
public static List asList(T... a)
T... a 是泛型可變參數,要求 T 為引用類型。
int[] data (基本類型數組);T 無法推導為 int;int[] 視為單個對象 (數組本身是對象),推導 T = int[];List,包含唯一一個元素:data 數組本身。| 代碼 | List 類型 | 元素數量 | 元素內容 |
|---|---|---|---|
Arrays.asList(1,2,3) | List | 3 | 1, 2, 3 (自動裝箱) |
Integer[] arr = {1,2,3}; Arrays.asList(arr) | List | 3 | 1, 2, 3 |
int[] arr = {1,2,3}; Arrays.asList(arr) | List | 1 | int[] {1,2,3} (單個數組對象) |
Arrays.stream(data).boxed().collect(Collectors.toList()) → ListInteger[] data = {1,2,3}; List list = Arrays.asList(data); Ints.asList(data) → List (無裝箱開銷,底層視圖)IntArrayList list = IntArrayList.newListWith(data); (基本類型集合,零裝箱)現代 IDE (IntelliJ IDEA、Eclipse) 會在 Arrays.asList(int[]) 處給出警告:
"Arrays.asList() called with primitive array argument, resulting in List
切勿忽視警告!
Arrays.stream(arr).boxed().collect(toList()) ~ 120 ms (裝箱 + 對象創建)
Guava Ints.asList(arr) ~ 0.01 ms (視圖模式,零拷貝)
Eclipse Collections IntArrayList ~ 5 ms (基本類型內存佈局)
結論:頻繁轉換、大數據量場景,**強烈建議引入 Guava 或 Eclipse Collections 基本類型集合庫**。
Arrays.asList(int[]) 是 Java 泛型擦除與基本類型不兼容的經典陷阱。
鐵律:Arrays.asList 只接受引用類型數組或可變參數列表。
基本類型數組轉 List,**首選 Stream.boxed()、Guava Ints.asList()、或基本類型集合庫**。