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

Java List 與陣列互轉深度解析:toArray() 陷阱與最佳實踐

     編輯:Java 相關知識

經典錯誤:ClassCastException

ArrayList<String> list = new ArrayList<>();
String[] strings = (String[]) list.toArray(); // 執行時拋出 ClassCastException

錯誤原因:toArray() 無參版本返回 Object[],無法向下轉型為 String[]。JVM 執行時檢查陣列實際類型是 Object[],非 String[]。

正確姿勢三種

1. 手動複製 (低效、不推薦)

String[] strings = new String[list.size()];
for (int i = 0; i < list.size(); i++) {
    strings[i] = list.get(i);
}

2. 傳入類型化陣列 (標準做法) ⭐

String[] strings = list.toArray(new String[0]); 
// 或預估大小優化:
String[] strings = list.toArray(new String[list.size()]);

原理:JDK 內部使用反射 Array.newInstance(componentType, size) 建立正確類型陣列。

3. Java 11+ 新方法 toArray(IntFunction)

String[] strings = list.toArray(String[]::new);

原始碼級解析:為什麼要這麼設計?

// ArrayList 內部實現
public <T> T[] toArray(T[] a) {
    if (a.length < size) 
        a = (T[]) java.lang.reflect.Array.newInstance(
            a.getClass().getComponentType(), size);
    System.arraycopy(elementData, 0, a, 0, size);
    if (a.length > size) a[size] = null;
    return a;
}

Java 泛型陣列無法直接 new T[size] (類型擦除),必須透過反射根據傳入陣列的組件類型動態建立。

反向轉換:陣列 → List

String[] arr = {"a", "b", "c"};
List<String> list = Arrays.asList(arr); // 返回固定大小 List
// 若需可修改 List:
List<String> modifiableList = new ArrayList<>(Arrays.asList(arr));

效能對比與建議

常見坑點提醒

  • Arrays.asList 返回的 List 長度固定,add/remove 會拋 UnsupportedOperationException
  • 基本類型陣列 (如 int[]) 無法直接用 Arrays.asList,會產生 List<int[]> 而非 List<Integer>
  • 並發環境下,轉換過程中集合被修改可能導致異常,建議加鎖或用 CopyOnWriteArrayList

掌握 toArray(T[]) 正確用法,是 Java 開發者避開類型轉換陷阱的必修課。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
方法適用場景效能備註
toArray(new T[0])一般用途良好JDK 內部優化,推薦
toArray(new T[size])大集合、追求極致最佳避免擴容複製
toArray(T[]::new)Java 11+良好語法簡潔,內部同樣優化
手動 for 迴圈特殊邏輯處理較慢避免除非必要