首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 綜合教學

Java 每日一題:Arrays.asList(int[]) 陷阱——返回 List 而非 List

     編輯:Java 綜合教學

題目回顧


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

根因深度解析

1. 方法簽名


public static  List asList(T... a)

T... a 是泛型可變參數,要求 T 為引用類型。

2. 類型推導過程

  • 傳入 int[] data (基本類型數組);
  • Java 泛型不支持基本類型,T 無法推導為 int;
  • 編譯器將 int[] 視為單個對象 (數組本身是對象),推導 T = int[];
  • 生成 List,包含唯一一個元素:data 數組本身。

3. 內存結構對比

代碼List 類型元素數量元素內容
Arrays.asList(1,2,3)List31, 2, 3 (自動裝箱)
Integer[] arr = {1,2,3}; Arrays.asList(arr)List31, 2, 3
int[] arr = {1,2,3}; Arrays.asList(arr)List1int[] {1,2,3} (單個數組對象)

正確轉換姿勢

  1. Java 8 Stream:Arrays.stream(data).boxed().collect(Collectors.toList()) → List
  2. 手動裝箱數組:Integer[] data = {1,2,3}; List list = Arrays.asList(data);
  3. Guava:Ints.asList(data) → List (無裝箱開銷,底層視圖)
  4. Eclipse Collections:IntArrayList list = IntArrayList.newListWith(data); (基本類型集合,零裝箱)

編譯器警示

現代 IDE (IntelliJ IDEA、Eclipse) 會在 Arrays.asList(int[]) 處給出警告:
"Arrays.asList() called with primitive array argument, resulting in List instead of List"
切勿忽視警告!

擴展:基本類型數組轉 List 的性能對比 (1000萬元素)


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()、或基本類型集合庫**。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved