Java 開發中數組與 List 互轉是高頻操作,掌握 Collection.toArray() 和 Arrays.asList() 的正確姿勢,能避免常見坑點(如型別不匹配、固定長度限制)。
List<String> list = new ArrayList<>();
list.add("1");
list.add("2");
// 關鍵:傳入「目標型別的零長度數組」或「精確長度數組」
String[] arr = list.toArray(new String[0]); // 推薦:JVM 優化零長度數組
// 或
String[] arr = list.toArray(new String[list.size()]);
避坑指南:
toArray() 無參版本,返回 Object[] 需強轉,易拋 ClassCastException。< list.size() 時,JVM 會重新分配同型別新數組(性能略有損耗)。> list.size() 時,多餘位置會被置 null(可用於判斷長度)。String[] arr = {"1", "2"};
List<String> list = Arrays.asList(arr);
核心特性:
UnsupportedOperationException。int[])會被當作單個元素,生成 List<int[]>。// 方案一:ArrayList 構造函數複製(推薦)
List<String> mutableList = new ArrayList<>(Arrays.asList(arr));
// 方案二:Stream API(Java 8+)
List<String> mutableList = Arrays.stream(arr).collect(Collectors.toList());
// 方案三:Collections.addAll
List<String> mutableList = new ArrayList<>();
Collections.addAll(mutableList, arr);
int[] primitiveArr = {1, 2, 3};
// 錯誤:List list = Arrays.asList(primitiveArr);
// 正確:手動裝箱或 Stream
List<Integer> list = Arrays.stream(primitiveArr).boxed().collect(Collectors.toList());
// 或 Apache Commons Lang
// List list = ArrayUtils.toObject(primitiveArr);