目錄
1、Arrays.asList()?
1.1、方法作用
1.2、內部實現
1.3、修改元素的影響
1.4、注意事項
2、list.toArray()?
2.1、方法作用
2.2、內部實現
2.3、修改元素的影響
2.4、特殊情況
1、對象引用
2、數組copy
3、對比總結
4、常見誤區與解決方案
5、實際應用建議
前言
????????在 Java 中,list.toArray()?和?Arrays.asList()?是兩個常見的集合與數組轉換方法。
????????它們的行為和對原始數據的影響有顯著區別,下面詳細分析它們的機制及對數據修改的影響。如下圖示:
1、Arrays.asList()?
1.1、方法作用
????????Arrays.asList(T....elements)?將數組或多個元素轉換為一個?List,返回的是??java.util.Arrays.ArrayList(不是??java.util.ArrayList)的實例。
1.2、內部實現
- 這個?List?是基于原始數組的視圖,即底層直接引用原始數組。
- 該?List?的大小是固定的(不能添加或刪除元素),但可以修改元素內容。
1.3、修改元素的影響
- 修改?List?中的元素?→ 會影響原始數組,因為兩者共享同一內存地址。
- 修改原始數組的元素?→ 也會影響?List。
示例代碼
String[] arr = {"A", "B", "C"};
List<String> list = Arrays.asList(arr);// 修改 List 中的元素
list.set(0, "X");
System.out.println(Arrays.toString(arr)); // 輸出: [X, B, C]// 修改原始數組
arr[1] = "Y";
System.out.println(list); // 輸出: [X, Y, C]
1.4、注意事項
- 不能添加/刪除元素:調用?add
()
?或?remove()
?會拋出?UnsupportedOperationException。 - 結構修改限制:僅支持修改元素內容,不支持改變集合大小。
2、list.toArray()?
2.1、方法作用
????????list<T>.toArray()??將集合轉換為一個數組,返回的是新數組的引用。
2.2、內部實現
- 不論調用?list.toArray()?還是?list.toArray()
(T[] a)
,最終都會創建一個新的數組,復制集合中的元素。 - 新數組與原始集合完全獨立,修改數組中的元素不會影響集合,反之亦然。
2.3、修改元素的影響
- 修改數組中的元素?→ 不會影響原始集合。
- 修改集合中的元素?→ 不會影響數組。
示例:
List<String> list = new ArrayList<>(Arrays.asList("A", "B", "C"));
String[] arr = list.toArray(new String[0]);// 修改數組中的元素
arr[0] = "X";
System.out.println(list); // 輸出: [A, B, C]// 修改集合中的元素
list.set(1, "Y");
System.out.println(Arrays.toString(arr)); // 輸出: [X, B, C]
2.4、特殊情況
1、對象引用
????????如果集合中存儲的是對象引用(而非基本類型),修改對象的屬性會影響原始集合和數組,因為它們指向同一個對象實例。
示例:
List<User> list = new ArrayList<>();
User user = new User("Tom");
list.add(user);
User[] arr = list.toArray(new User[0]);// 修改對象屬性
arr[0].setName("Jerry");
System.out.println(list.get(0).getName()); // 輸出: Jerry
2、數組copy
??注意:強行使用array增加元素copy。
可參考:
String[] array = {"1", "2"}; // 原始數組
String[] newArray = new String[array.length + 1]; // 新建長度+1的數組
System.arraycopy(array, 0, newArray, 0, array.length); // 復制舊元素
newArray[newArray.length - 1] = "3"; // 添加新元素
小結:
3、對比總結
4、常見誤區與解決方案
4.1 誤區:Arrays.asList()可以創建動態列表
- 錯誤:Arrays.asList()返回的列表是固定大小的,不能添加或刪除元素。
- 解決方案:如果需要動態列表,需顯式轉換為 new ArrayList<>(Arrays.asList(.....))。
4.4 誤區 :Arrays.asList()
?返回的是?java.util.ArrayList
- 錯誤:Arrays.asList()?返回的是?java.util.Arrays.ArrayList,不是?java.util.ArrayList。
- 解決方案:如果需要動態列表,顯式使用? new ArrayList<>()。
4.2 誤區:list.toArray()?返回的數組是集合的引用
- 錯誤:list.toArray()?返回的是新數組,與集合無直接關聯。
- 解決方案:如果需要共享數據,應直接操作集合或使用?Arrays.asList()。
4.3 誤區:對象引用的修改不會影響彼此
- 注意:如果數組或集合中的元素是對象引用,修改對象的屬性會同步到彼此。
- 解決方案:如果需要獨立拷貝,需手動深拷貝對象。
5、實際應用建議
- 需要修改元素且避免副作用:使用?Arrays.asList(),但需確保不進行結構性修改。
- 需要獨立數組:使用?list.toArray()。
- 需要動態列表:使用? new ArrayList<>(Arrays.asList(.....))。
- 涉及對象引用時:注意深拷貝或使用不可變對象。
舉例:
ArrayList<String> arrayList = new ArrayList<>();
arrayList.add("1");
arrayList.add("2");
arrayList.add("3");
arrayList.add("4");
arrayList.add("5");
System.out.println("修改前的arrayList" + arrayList); // 輸出: [1, 2, 3, 4, 5]
System.out.println("arrayList的size==" + arrayList.size()); // 輸出: 5// 轉換為數組
String[] array = arrayList.toArray(new String[0]);
array[0] = "6";
System.out.println("修改后的array" + Arrays.toString(array)); // 輸出: [6, 2, 3, 4, 5]
System.out.println("修改后的arrayList" + arrayList); // 輸出: [1, 2, 3, 4, 5]
關鍵點解釋
1.?list.toArray()?返回的是?新數組
- arrayList.toArray(new String[0])會創建一個新的數組,并將?arrayList?中的所有元素復制到這個數組中。
- 新數組和?arrayList?是獨立的,它們的內存地址不同。
2. 修改數組元素不影響原集合
- 在代碼中,array
[0] = "6"
?只是修改了數組的第 0 個元素,但?arrayList?仍然指向原來的字符串對象?"1"
。 - 因為?String?是不可變類型(Immutable),所以修改數組中的元素不會影響?arrayList?中的值。
3. 為什么原集合沒有變化?
- arrayList?和?array?是兩個獨立的數據結構:
- arrayList?是一個動態集合,內部通過數組實現。
- array?是一個靜態數組,與?arrayList?無關。
- 修改?array?中的元素,不會改變?arrayList?內部的數組內容。
對比:如果元素是可變對象
????????如果集合中存儲的是可變對象(如自定義類),修改數組中的對象屬性會影響原集合,因為它們引用的是同一個對象實例。
例如:
class User {String name;public User(String name) { this.name = name; }public void setName(String name) { this.name = name; }
}List<User> list = new ArrayList<>();
User user = new User("Tom");
list.add(user);
User[] array = list.toArray(new User[0]);// 修改數組中的對象屬性
array[0].setName("Jerry");
System.out.println(list.get(0).name); // 輸出: Jerry
// ? 可以動態添加元素
List<String> list = new ArrayList<>(Arrays.asList("1", "2"));
list.add("3"); // 成功添加// ? 無法動態添加元素
List<String> stringList = Arrays.asList("3", "4");
stringList.add("3"); // 拋出 UnsupportedOperationException
stringList.add("4"); // 拋出 UnsupportedOperationException
????????核心原因:Arrays.asList()?返回的?List?是固定大小的
總結: