核心結論
| 轉換方向 | 方法 | 修改新結構是否影響原結構 | 原因 |
| 數組 → List | Arrays.asList(arr) | 是(修改元素內容/替換元素) | 返回固定長度 List,底層共享同一數組引用 |
| List → 數組 | list.toArray(new T[0]) | 否(新數組獨立副本) | 內部調用 Arrays.copyOf,創建新數組 |
源碼證據
Arrays.asList
public static List asList(T... a) {
return new ArrayList<>(a); // 非 java.util.ArrayList,而是內部私有類
}
// 內部類 ArrayList extends AbstractList {
// private final E[] a;
// ArrayList(E[] array) { this.a = array; } // 直接引用傳入數組
// public E set(int index, E element) { E old = a[index]; a[index]=element; return old; }
// }
ArrayList.toArray
public T[] toArray(T[] a) {
if (a.length < size)
return (T[]) Arrays.copyOf(elementData, size, a.getClass()); // 新數組
System.arraycopy(elementData, 0, a, 0, size);
if (a.length > size) a[size] = null;
return a;
}
實測驗證
// 情況 1:數組轉 List 修改影響原數組
String[] arr = {"a","b"};
List list = Arrays.asList(arr);
list.set(0, "x");
System.out.println(arr[0]); // "x" ← 原數組被修改
// 情況 2:List 轉數組修改不影響 List
List list2 = new ArrayList<>(Arrays.asList("a","b"));
String[] arr2 = list2.toArray(new String[0]);
arr2[0] = "y";
System.out.println(list2.get(0)); // "a" ← List 未變
建議
- 需獨立副本時:
new ArrayList<>(Arrays.asList(arr)) 或 List.of(arr).stream().collect(Collectors.toList())。
- 僅讀場景直接用
Arrays.asList 避免拷貝開銷。