首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

Java 集合與數組相互轉換後修改元素是否影響原對象:Arrays.asList 與 toArray 源碼解析

     編輯:程式設計疑難解答

核心結論

轉換方向方法修改新結構是否影響原結構原因
數組 → ListArrays.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 避免拷貝開銷。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved