最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

關(guān)于集合與數(shù)組轉(zhuǎn)換實(shí)現(xiàn)方法

 更新時(shí)間:2025年06月30日 14:38:44   作者:找不到、了  
這篇文章主要介紹了關(guān)于集合與數(shù)組轉(zhuǎn)換實(shí)現(xiàn)方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

在 Java 中,list.toArray()和Arrays.asList()是兩個(gè)常見的集合與數(shù)組轉(zhuǎn)換方法。

它們的行為和對(duì)原始數(shù)據(jù)的影響有顯著區(qū)別,下面詳細(xì)分析它們的機(jī)制及對(duì)數(shù)據(jù)修改的影響。如下圖示:

1、Arrays.asList()

1.1、方法作用

Arrays.asList(T....elements)將數(shù)組或多個(gè)元素轉(zhuǎn)換為一個(gè)List,返回的是java.util.Arrays.ArrayList(不是java.util.ArrayList)的實(shí)例。

1.2、內(nèi)部實(shí)現(xiàn)

  • 這個(gè)List是基于原始數(shù)組的視圖,即底層直接引用原始數(shù)組。
  • 該List的大小是固定的(不能添加或刪除元素),但可以修改元素內(nèi)容。

1.3、修改元素的影響

  • 修改List中的元素→ 會(huì)影響原始數(shù)組,因?yàn)閮烧吖蚕硗粌?nèi)存地址。
  • 修改原始數(shù)組的元素→ 也會(huì)影響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]

// 修改原始數(shù)組
arr[1] = "Y";
System.out.println(list); // 輸出: [X, Y, C]

1.4、注意事項(xiàng)

  • 不能添加/刪除元素:調(diào)用add()或remove()會(huì)拋出UnsupportedOperationException。
  • 結(jié)構(gòu)修改限制:僅支持修改元素內(nèi)容,不支持改變集合大小。

2、list.toArray()

2.1、方法作用

list<T>.toArray()將集合轉(zhuǎn)換為一個(gè)數(shù)組,返回的是新數(shù)組的引用。

2.2、內(nèi)部實(shí)現(xiàn)

  • 不論調(diào)用list.toArray()還是list.toArray()(T[] a),最終都會(huì)創(chuàng)建一個(gè)新的數(shù)組,復(fù)制集合中的元素。
  • 新數(shù)組與原始集合完全獨(dú)立,修改數(shù)組中的元素不會(huì)影響集合,反之亦然。

2.3、修改元素的影響

  • 修改數(shù)組中的元素→ 不會(huì)影響原始集合。
  • 修改集合中的元素→ 不會(huì)影響數(shù)組。

示例:

List<String> list = new ArrayList<>(Arrays.asList("A", "B", "C"));
String[] arr = list.toArray(new String[0]);

// 修改數(shù)組中的元素
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、對(duì)象引用

如果集合中存儲(chǔ)的是對(duì)象引用(而非基本類型),修改對(duì)象的屬性會(huì)影響原始集合和數(shù)組,因?yàn)樗鼈冎赶蛲粋€(gè)對(duì)象實(shí)例。

示例:

List<User> list = new ArrayList<>();
User user = new User("Tom");
list.add(user);
User[] arr = list.toArray(new User[0]);

// 修改對(duì)象屬性
arr[0].setName("Jerry");
System.out.println(list.get(0).getName()); // 輸出: Jerry

2、數(shù)組copy

??注意:強(qiáng)行使用array增加元素copy。

可參考:

String[] array = {"1", "2"}; // 原始數(shù)組
String[] newArray = new String[array.length + 1]; // 新建長(zhǎng)度+1的數(shù)組
System.arraycopy(array, 0, newArray, 0, array.length); // 復(fù)制舊元素
newArray[newArray.length - 1] = "3"; // 添加新元素

小結(jié):

3、對(duì)比總結(jié)

4、常見誤區(qū)與解決方案

4.1 誤區(qū):Arrays.asList()可以創(chuàng)建動(dòng)態(tài)列表

  • 錯(cuò)誤:Arrays.asList()返回的列表是固定大小的,不能添加或刪除元素。
  • 解決方案:如果需要?jiǎng)討B(tài)列表,需顯式轉(zhuǎn)換為 new ArrayList<>(Arrays.asList(.....))。

4.4 誤區(qū) :Arrays.asList()返回的是java.util.ArrayList

  • 錯(cuò)誤:Arrays.asList()返回的是java.util.Arrays.ArrayList,不是java.util.ArrayList。
  • 解決方案:如果需要?jiǎng)討B(tài)列表,顯式使用 new ArrayList<>()。

4.2 誤區(qū):list.toArray()返回的數(shù)組是集合的引用

  • 錯(cuò)誤:list.toArray()返回的是新數(shù)組,與集合無(wú)直接關(guān)聯(lián)。
  • 解決方案:如果需要共享數(shù)據(jù),應(yīng)直接操作集合或使用Arrays.asList()。

4.3 誤區(qū):對(duì)象引用的修改不會(huì)影響彼此

  • 注意:如果數(shù)組或集合中的元素是對(duì)象引用,修改對(duì)象的屬性會(huì)同步到彼此。
  • 解決方案:如果需要獨(dú)立拷貝,需手動(dòng)深拷貝對(duì)象。

5、實(shí)際應(yīng)用建議

  • 需要修改元素且避免副作用:使用Arrays.asList(),但需確保不進(jìn)行結(jié)構(gòu)性修改。
  • 需要獨(dú)立數(shù)組:使用list.toArray()。
  • 需要?jiǎng)討B(tài)列表:使用 new ArrayList<>(Arrays.asList(.....))。
  • 涉及對(duì)象引用時(shí):注意深拷貝或使用不可變對(duì)象。

舉例:

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

// 轉(zhuǎn)換為數(shù)組
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]

關(guān)鍵點(diǎn)解釋

1.list.toArray()返回的是新數(shù)組

  • arrayList.toArray(new String[0])會(huì)創(chuàng)建一個(gè)新的數(shù)組,并將arrayList中的所有元素復(fù)制到這個(gè)數(shù)組中。
  • 新數(shù)組和arrayList是獨(dú)立的,它們的內(nèi)存地址不同。

2. 修改數(shù)組元素不影響原集合

  • 在代碼中,array[0] = "6"只是修改了數(shù)組的第 0 個(gè)元素,但arrayList仍然指向原來的字符串對(duì)象"1"
  • 因?yàn)镾tring是不可變類型(Immutable),所以修改數(shù)組中的元素不會(huì)影響arrayList中的值。

3. 為什么原集合沒有變化?

arrayList和array是兩個(gè)獨(dú)立的數(shù)據(jù)結(jié)構(gòu):

  • arrayList是一個(gè)動(dòng)態(tài)集合,內(nèi)部通過數(shù)組實(shí)現(xiàn)。
  • array是一個(gè)靜態(tài)數(shù)組,與arrayList無(wú)關(guān)。

修改array中的元素,不會(huì)改變arrayList內(nèi)部的數(shù)組內(nèi)容。

對(duì)比:如果元素是可變對(duì)象

如果集合中存儲(chǔ)的是可變對(duì)象(如自定義類),修改數(shù)組中的對(duì)象屬性會(huì)影響原集合,因?yàn)樗鼈円玫氖峭粋€(gè)對(duì)象實(shí)例。

  • 例如:
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]);

// 修改數(shù)組中的對(duì)象屬性
array[0].setName("Jerry");
System.out.println(list.get(0).name); // 輸出: Jerry
// ? 可以動(dòng)態(tài)添加元素
List<String> list = new ArrayList<>(Arrays.asList("1", "2"));
list.add("3"); // 成功添加

// ? 無(wú)法動(dòng)態(tài)添加元素
List<String> stringList = Arrays.asList("3", "4");
stringList.add("3"); // 拋出 UnsupportedOperationException
stringList.add("4"); // 拋出 UnsupportedOperationException

核心原因:Arrays.asList()返回的List是固定大小的

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • java線程中synchronized和Lock區(qū)別及介紹

    java線程中synchronized和Lock區(qū)別及介紹

    這篇文章主要為大家介紹了java線程中synchronized和Lock區(qū)別及介紹,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-06-06
  • Spring File Storage文件的對(duì)象存儲(chǔ)框架基本使用小結(jié)

    Spring File Storage文件的對(duì)象存儲(chǔ)框架基本使用小結(jié)

    在開發(fā)過程當(dāng)中,會(huì)使用到存文檔、圖片、視頻、音頻等等,這些都會(huì)涉及存儲(chǔ)的問題,文件可以直接存服務(wù)器,但需要考慮帶寬和存儲(chǔ)空間,另外一種方式就是使用云存儲(chǔ),這篇文章主要介紹了Spring File Storage文件的對(duì)象存儲(chǔ)框架基本使用小結(jié),需要的朋友可以參考下
    2024-08-08
  • Spring中的@DependsOn注解使用解析

    Spring中的@DependsOn注解使用解析

    這篇文章主要介紹了Spring中的@DependsOn注解使用解析,@DependsOn注解可以定義在類和方法上,意思是我這個(gè)組件要依賴于另一個(gè)組件,也就是說被依賴的組件會(huì)比該組件先注冊(cè)到IOC容器中,需要的朋友可以參考下
    2024-01-01
  • 超個(gè)性修改SpringBoot項(xiàng)目的啟動(dòng)banner的方法

    超個(gè)性修改SpringBoot項(xiàng)目的啟動(dòng)banner的方法

    這篇文章主要介紹了超個(gè)性修改SpringBoot項(xiàng)目的啟動(dòng)banner的方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-03-03
  • idea中使用(Revert Commit)圖解

    idea中使用(Revert Commit)圖解

    這篇文章主要介紹了idea中使用(Revert Commit)圖解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-02-02
  • 如何在Java Deeplearning4j中進(jìn)行數(shù)據(jù)加載與預(yù)處理

    如何在Java Deeplearning4j中進(jìn)行數(shù)據(jù)加載與預(yù)處理

    本文介紹了如何在 Deeplearning4j 中加載和預(yù)處理數(shù)據(jù),包括圖像和 CSV 數(shù)據(jù)的加載,以及基本的數(shù)據(jù)標(biāo)準(zhǔn)化和分割操作,本文結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),感興趣的朋友跟隨小編一起看看吧
    2025-09-09
  • 解讀JDK8踩坑JCE加密限制版本問題

    解讀JDK8踩坑JCE加密限制版本問題

    這篇文章主要介紹了JDK8踩坑JCE加密限制版本問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-05-05
  • java中DelayQueue實(shí)例用法詳解

    java中DelayQueue實(shí)例用法詳解

    在本篇內(nèi)容里小編給大家分享的是一篇關(guān)于java中DelayQueue實(shí)例用法詳解內(nèi)容,有需要的朋友們可以跟著學(xué)習(xí)下。
    2021-01-01
  • 淺談mybatis主鍵生成的幾種策略

    淺談mybatis主鍵生成的幾種策略

    本文主要介紹了淺談mybatis主鍵生成策略,包括使用數(shù)據(jù)庫(kù)自增主鍵、使用UUID生成主鍵和使用MyBatis-Plus的雪花算法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2026-01-01
  • 在JDK和Eclipse下如何編寫和運(yùn)行Java Applet

    在JDK和Eclipse下如何編寫和運(yùn)行Java Applet

    本文主要介紹了在JDK和Eclipse的環(huán)境下如何編寫和運(yùn)行Java Applet,圖文方式,適合初學(xué)者學(xué)習(xí)。
    2015-09-09

最新評(píng)論

泗阳县| 卢氏县| 贺兰县| 天台县| 杂多县| 阿尔山市| 高淳县| 读书| 崇信县| 武定县| 唐河县| 迁西县| 柳河县| 盐池县| 密山市| 云林县| 辽源市| 开远市| 稷山县| 潍坊市| 新营市| 吕梁市| 潼南县| 涞源县| 利辛县| 苏州市| 鹤岗市| 克东县| 海晏县| 泊头市| 嘉义县| 上思县| 文成县| 嵊泗县| 宝山区| 玛沁县| 德州市| 宁晋县| 桃源县| 镇赉县| 津南区|