深入探討集合與數組轉換方法

目錄

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?是固定大小的


總結:

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/83076.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/83076.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/83076.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

深入理解交叉熵損失函數——全面推演各種形式

帶你從不一樣的視角綜合認識交叉熵損失&#xff0c;閱讀這篇文章&#xff0c;幫你建立其分類問題&#xff0c;對比學習&#xff0c;行人重識別&#xff0c;人臉識別等問題的聯系&#xff0c;閱讀這篇文章相信對你閱讀各種底層深度學習論文有幫助。 引言 1. 重新理解全連接層&…

STM32之FreeRTOS移植(重點)

RTOS的基本概念 實時操作系統&#xff08;Real Time Operating System&#xff09;的簡稱就叫做RTOS&#xff0c;是指具有實時性、能支持實時控制系統工作的操作系統&#xff0c;RTOS的首要任務就是調度所有可以利用的資源來完成實時控制任務的工作&#xff0c;其次才是提高工…

MySQL connection close 后, mysql server上的行為是什么

本文著重講述的是通過 msql client 連接到 mysql server &#xff0c;發起 update 、 select 操作(由于數據量非常大&#xff0c;所以 update、select 操作都很耗時&#xff0c;即在結果返回前我們有足夠的時間執行一些操作) 。 在客戶端分別嘗試執行 ctrl C 結束關閉 mysql c…

dvwa3——CSRF

LOW&#xff1a; 先嘗試change一組密碼&#xff1a;123456 修改成功&#xff0c;我們觀察上面的url代碼 http://localhost/DVWA/vulnerabilities/csrf/?password_new123456&password_conf123456&ChangeChange# 將password_new部分與password_conf部分改成我們想要的…

Linux 中常見的安全與權限機制

Linux 中常見的安全與權限機制主要包括以下幾類&#xff0c;從文件系統權限到系統級訪問控制&#xff0c;構建了多層次的安全保障體系。 &#x1f510; 一、文件權限與用戶管理 1. 基本權限&#xff08;rwx&#xff09; r&#xff08;read&#xff09;&#xff1a;讀取文件內…

CSS篇-3

1. CSS 中哪些樣式可以繼承&#xff1f;哪些不可以繼承&#xff1f; 可繼承的樣式&#xff1a; 與字體相關的樣式&#xff0c;如&#xff1a;font-size、font-family、color 列表樣式&#xff1a;list-style&#xff08;如 UL、OL 的 list-style-type&#xff09; 不可繼承…

計算機網絡物理層基礎練習

第二章 物理層 填空題 從通信雙方信息交互的方式來看&#xff0c;通信的三種基本方式為單工、半雙工和全雙工。其中&#xff0c;單工數據傳輸只支持數據在一個方向上傳輸&#xff0c;全雙工數據傳輸則允許數據同時在兩個方向上傳輸。最基本的帶通調制方法包括三種&#xff1a…

Redis7底層數據結構解析

redisObject 在 Redis 的源碼中&#xff0c;Redis 會將底層數據結構&#xff08;如 SDS、hash table、skiplist 等&#xff09;統一封裝成一個對象&#xff0c;這個對象叫做 redisObject&#xff0c;也簡稱 robj。 typedef struct redisObject {unsigned type : 4; // 數…

華為OD機試_2025 B卷_靜態掃描(Python,100分)(附詳細解題思路)

題目描述 靜態掃描可以快速識別源代碼的缺陷&#xff0c;靜態掃描的結果以掃描報告作為輸出&#xff1a; 1、文件掃描的成本和文件大小相關&#xff0c;如果文件大小為N&#xff0c;則掃描成本為N個金幣 2、掃描報告的緩存成本和文件大小無關&#xff0c;每緩存一個報告需要…

【Java】在 Spring Boot 中連接 MySQL 數據庫

在 Spring Boot 中連接 MySQL 數據庫是一個常見的任務。Spring Boot 提供了自動配置功能&#xff0c;使得連接 MySQL 數據庫變得非常簡單。以下是詳細的步驟&#xff1a; 一、添加依賴 首先&#xff0c;確保你的pom.xml文件中包含了 Spring Boot 的 Starter Data JPA 和 MySQ…

基于51單片機的音樂盒鍵盤演奏proteus仿真

地址&#xff1a; https://pan.baidu.com/s/1tZCAxQQ7cvyzBfztQpk0UA 提取碼&#xff1a;1234 仿真圖&#xff1a; 芯片/模塊的特點&#xff1a; AT89C52/AT89C51簡介&#xff1a; AT89C51 是一款常用的 8 位單片機&#xff0c;由 Atmel 公司&#xff08;現已被 Microchip 收…

Android Native 之 adbd進程分析

目錄 1、adbd守護進程 2、adbd權限降級 3、adbd命令解析 1&#xff09;adb shell 2&#xff09;adb root 3&#xff09;adb reboot 4、案例 1&#xff09;案例之實現不需要執行adb root命令自動具有root權限 2&#xff09;案例之實現不需要RSA認證直接能夠使用adb she…

C語言進階--動態內存管理

學習數據結構重要的三個部分&#xff1a;指針、結構體、動態內存管理&#xff08;malloc、calloc、realloc、free&#xff09;。 1.為什么存在動態內存分配&#xff1f; 1.空間開辟大小是固定的&#xff1b; 2.數組在聲明時&#xff0c;必須指定數組的長度&#xff0c;它所需…

C# 密封類和密封方法

密封(sealed)是C#中用于限制繼承和多態行為的關鍵字&#xff0c;它可以應用于類和方法&#xff0c;提供了一種控制繼承層次的方式。 密封類 特點 使用 sealed 關鍵字修飾的類密封類不能被其他類繼承&#xff0c;但可以繼承其他類或接口主要用于防止派生所有結構(struct)都是…

thinkpad T-440p 2025.05.31

thinkpad T-440p 2025.05.31 老了退休了&#xff0c;說起來真的可惡現在筆記本的設計師&#xff0c;只有固態硬盤了

WPS自動換行

換行前 換行后 快捷鍵 第一步&#xff1a;啟用「自動換行」功能 選中目標單元格/區域&#xff1a;點擊需要設置的單元格&#xff08;或拖動選中多個單元格&#xff09;。開啟自動換行&#xff08;3種方式任選&#xff09;&#xff1a; 快捷按鈕&#xff1a;在頂部菜單欄點擊「…

cuda_fp8.h錯誤

現象&#xff1a; cuda_fp8.h錯誤 原因&#xff1a; CUDA Toolkit 小于11.8,會報fp8錯誤&#xff0c;因此是cuda工具版本太低。通過nvcc --version查看 CUDA Toolkit 是 NVIDIA 提供的一套 用于開發、優化和運行基于 CUDA 的 GPU 加速應用程序的工具集合。它的核心作用是讓開發…

【TTS】基于GRPO的流匹配文本到語音改進:F5R-TTS

論文地址&#xff1a;https://arxiv.org/abs/2504.02407v3 摘要 我們提出了F5R-TTS&#xff0c;這是一種新穎的文本到語音(TTS)系統&#xff0c;它將群體相對策略優化(GRPO)集成到基于流匹配的架構中。 通過將流匹配TTS的確定性輸出重新表述為概率高斯分布&#xff0c;我們的方…

頭歌java課程實驗(Java面向對象 - 包裝類)

第1關&#xff1a;基本數據類型和包裝類之間的轉換 任務描述 本關任務&#xff1a;實現基本數據類型與包裝類之間的互相轉換。 相關知識 為了完成本關任務&#xff0c;你需要掌握&#xff1a; 1.什么是包裝類&#xff1b; 2.怎么使用包裝類。 什么是包裝類 在JAVA中&#x…

實現一個免費可用的文生圖的MCP Server

概述 文生圖模型為使用 Cloudflare Worker AI 部署 Flux 模型&#xff0c;是參照視頻https://www.bilibili.com/video/BV1UbkcYcE24/?spm_id_from333.337.search-card.all.click&vd_source9ca2da6b1848bc903db417c336f9cb6b的復現Cursor MCP Server實現是參照文章https:/…