String[] arr = {"a", "b", "c"};
List list = new ArrayList<>(Arrays.asList(arr));
int[])會被視為單個元素,得到 List 而非 List。Listlist = Arrays.asList(arr);
java.util.Arrays$ArrayList(非 java.util.ArrayList),長度固定,不支持 add/remove/clear,操作拋出 UnsupportedOperationException。list.set(0, "x") 會同步修改原數組,副作用極大。Listlist = new ArrayList<>(arr.length); Collections.addAll(list, arr);
Arrays.asList 但僅遍歷一次,只創建一個 ArrayList,無中間對象。Listlist = new ArrayList<>(); list.addAll(Arrays.asList(arr));
Collections.addAll。Listlist = new ArrayList<>(arr.length); for (String s : arr) list.add(s);
Collections.addAll 齊平。| 方式 | 平均耗時 (ns/op) | 分配率 (MB/sec) | 備註 |
|---|---|---|---|
| Collections.addAll | ~1,200 | ~45 | ⭐ 推薦 |
| 手動 for 循環 | ~1,250 | ~45 | ⭐ 同級 |
| new ArrayList(Arrays.asList) | ~1,800 | ~78 | 雙對象分配 |
| list.addAll(Arrays.asList) | ~1,750 | ~75 | 中間對象 |
| Arrays.asList 直接賦值 | ~300 | ~12 | 不可變,極快但危險 |
int[] primitiveArr = {1, 2, 3};
List list = Arrays.stream(primitiveArr).boxed().collect(Collectors.toList());
或使用 Guava: Ints.asList(primitiveArr) (返回不可變 List,需再拷貝)。
Arrays.asList,改用 Stream/Guava/手動循環。Arrays.asList 直接賦值,必須 new ArrayList(...) 或 Collections.addAll。Collections.addAll(new ArrayList<>(size), arr),預估容量避免擴容。List.of(arr) (Java 9+) 或 Collections.unmodifiableList 更語義化。public staticList toList(T[] array) { if (array == null || array.length == 0) return Collections.emptyList(); List list = new ArrayList<>(array.length); Collections.addAll(list, array); return list; } // 基本類型專用 public static List toList(int[] array) { if (array == null || array.length == 0) return Collections.emptyList(); List list = new ArrayList<>(array.length); for (int v : array) list.add(v); return list; }