欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java實(shí)戰(zhàn)小技巧之?dāng)?shù)組與list互轉(zhuǎn)

 更新時(shí)間:2021年08月10日 14:50:41   作者:一灰灰  
在Java中,經(jīng)常遇到需要List與數(shù)組互相轉(zhuǎn)換的場(chǎng)景,下面這篇文章主要給大家介紹了關(guān)于Java實(shí)戰(zhàn)小技巧之?dāng)?shù)組與list互轉(zhuǎn)的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考下

前言

這個(gè)考題比較常見,也比較簡(jiǎn)單,難道就這也有什么可以說(shuō)到的門路不成?

接下來(lái)本文好好的說(shuō)一說(shuō)它的幾種實(shí)現(xiàn)姿勢(shì),總有一款你喜歡的

I. 數(shù)組轉(zhuǎn) List

1. Array.asList

這個(gè)考題太簡(jiǎn)單了,直接使用Array.asList不就完事了么,比如

@Test
public void ary2list() {
    String[] ary = new String[]{ "1", "a"};
    List<String> list = Arrays.asList((ary);
    System.out.println(list);
}

數(shù)組轉(zhuǎn) list,so easy!!!

真的就這么簡(jiǎn)單么???

且看下面這一段代碼

public void ary2list() {
    String[] ary = new String[]{ "1", "a"};
    List<String> list = Arrays.asList((ary);
    System.out.println(list);

    list.add("c");
    System.out.println(list);
}

直接拋出了異常java.lang.UnsupportedOperationException

有興趣的小伙伴可以看一下源碼實(shí)現(xiàn)方式,通過(guò)Arrays.asList創(chuàng)建的 List,雖說(shuō)也命名是ArrayList,但是它的全路徑為 java.util.Arrays.ArrayList, 不支持add, remove等操作(所以下次再有面試官問(wèn) ArrayList 的知識(shí)點(diǎn)時(shí),就可以反問(wèn)一句,老哥你指的是哪個(gè) ArrayList😝,逼格是不是立馬拉起來(lái))

1.1 知識(shí)點(diǎn)

通過(guò)Arrays.asList創(chuàng)建的列表,不允許新增,刪除元素;但是可以更新列表中元素的值

2. new ArrayList

上面的數(shù)組轉(zhuǎn) list 方式雖然是最簡(jiǎn)單的,但不一定是合適的,特別是當(dāng)我們可能對(duì)轉(zhuǎn)換后的 list 進(jìn)行操作時(shí),可能埋坑(而且這種坑還非常隱晦,代碼層面上很難發(fā)現(xiàn))

為了減少在代碼里面下毒的可能性,不妨使用下面這種方式new ArrayList<>(Arrays.asList(ary))

String[] ary = new String[]{ "1", "a"};
List<String> out = new ArrayList<>(Arrays.asList(ary));
out.add("hello");
System.out.println(out);

通過(guò)上面這種方式創(chuàng)建的 List,就是我們熟知的ArrayList了

2.1 避雷預(yù)警

看到上面這個(gè)使用姿勢(shì),就很容易想到一個(gè)常見的踩雷點(diǎn),比如我們的應(yīng)用中,有一個(gè)全局共享的配置列表,張三需要拿 id 為奇數(shù)的配置,李四拿 id 為偶數(shù)的配置,然后他們都是這么做的

list.removeIf(s -> s.id % 2 == 0);

然后跑了一次之后發(fā)現(xiàn)這個(gè)全局的列表清空了,這就是典型的沒(méi)有做好資源隔離的 case 了,針對(duì)這種場(chǎng)景,要么是限制使用方,直接針對(duì)全局的資源進(jìn)行修改,要么就是使用方拿到的是一個(gè)隔離的備份

禁止修改:

  • 使用不可變的容器,如前面提到的java.util.Arrays.ArrayList ()
  • 使用Collections.unmodifiableList創(chuàng)建
List<String> unModifyList = Collections.unmodifiableList(out);

列表拷貝

new ArrayList<>(Arrays.asList(ary));

(上面這種屬于深拷貝的實(shí)現(xiàn),具體可以看一下 jdk 的源碼實(shí)現(xiàn))

3. Collections.addAll

第三種方式借助 jdk 提供的容器工具類Collections來(lái)實(shí)現(xiàn)

@Test
public void ary2listV3() {
    String[] ary = new String[]{ "1", "a"};
    // 創(chuàng)建列表,并指定長(zhǎng)度,避免可能產(chǎn)生的擴(kuò)容
    List<String> out = new ArrayList<>(ary.length);
    // 實(shí)現(xiàn)數(shù)組添加到列表中
    Collections.addAll(out, ary);

    // 因?yàn)榱斜頌槲覀兌x的ArrayList,因此可以對(duì)它進(jìn)行增刪改
    out.add("hello");
    System.out.println(out);
}

原則上是比較推薦這種方式來(lái)實(shí)現(xiàn)的,至于為啥?看下源碼實(shí)現(xiàn)

public static <T> boolean addAll(Collection<? super T> c, T... elements) {
    boolean result = false;
    for (T element : elements)
        result |= c.add(element);
    return result;
}

這段代碼的實(shí)現(xiàn)是不是非常眼熟,如果讓我們自己來(lái)寫,也差不多會(huì)寫成這樣吧,簡(jiǎn)單直觀高效,完美

II. 列表轉(zhuǎn)數(shù)組

不同于數(shù)組轉(zhuǎn)列表的幾種玩法,列表轉(zhuǎn)數(shù)組就簡(jiǎn)單多了,直接調(diào)用List.toArray

List<String> list = Arrays.asList("a", "b", "c");
// 返回的是Object[] 數(shù)組
Object[] cell = list.toArray();

// 如果需要指定數(shù)組類型,可以傳一個(gè)指定各類型的空的數(shù)組
// 也可以傳一個(gè)與目標(biāo)列表長(zhǎng)度相等的數(shù)組,這樣會(huì)將列表中的元素拷貝到這個(gè)數(shù)組中
String[] strCell = list.toArray(new String[]{});

III. 小結(jié)

今天的博文主題是數(shù)組與列表的互轉(zhuǎn),雖說(shuō)題目簡(jiǎn)單,但是實(shí)現(xiàn)方式也是多種,需要搞清楚它們之間的本質(zhì)區(qū)別,一不小心就可能采坑,而最簡(jiǎn)單的地方掉坑里,往往是最難發(fā)現(xiàn)和爬出來(lái)的

核心知識(shí)點(diǎn)小結(jié)如下

數(shù)組轉(zhuǎn) list:

  • Arrays.asList(xxx):創(chuàng)建的是不可變列表,不能刪除和新增元素
  • new ArrayList<>(Arrays.asList(xxx): 相當(dāng)于用列表創(chuàng)建列表,屬于深拷貝的一種表現(xiàn),獲取到的列表支持新增、刪除
  • 推薦寫法 Collections.addAll()

列表轉(zhuǎn)數(shù)組

  • list.toArray: 如果需要指定數(shù)組類型,則傳參指定

總結(jié)

到此這篇關(guān)于Java實(shí)戰(zhàn)小技巧之?dāng)?shù)組與list互轉(zhuǎn)的文章就介紹到這了,更多相關(guān)Java數(shù)組與list互轉(zhuǎn)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • mybatis如何實(shí)現(xiàn)in傳入數(shù)組查詢

    mybatis如何實(shí)現(xiàn)in傳入數(shù)組查詢

    這篇文章主要介紹了mybatis如何實(shí)現(xiàn)in傳入數(shù)組查詢方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-10-10
  • Mybatis中的自定義映射resultMap

    Mybatis中的自定義映射resultMap

    在MyBatis中,自定義映射resultMap可以讓你精確控制如何將數(shù)據(jù)庫(kù)返回的結(jié)果集映射到Java對(duì)象上,本文給介紹了Mybatis之自定義映射resultMap,需要的朋友可以參考下
    2024-03-03
  • java對(duì)象拷貝詳解及實(shí)例

    java對(duì)象拷貝詳解及實(shí)例

    這篇文章主要介紹了java對(duì)象拷貝詳解及實(shí)例的相關(guān)資料,需要的朋友可以參考下
    2017-04-04
  • Java求兩個(gè)正整數(shù)的最大公約數(shù)和最小公倍數(shù)

    Java求兩個(gè)正整數(shù)的最大公約數(shù)和最小公倍數(shù)

    這篇文章主要介紹了輸入兩個(gè)正整數(shù)m和n,求其最大公約數(shù)和最小公倍數(shù),需要的朋友可以參考下
    2017-02-02
  • Mybatis中TypeAliasRegistry的作用及使用方法

    Mybatis中TypeAliasRegistry的作用及使用方法

    Mybatis中的TypeAliasRegistry是一個(gè)類型別名注冊(cè)表,它的作用是為Java類型建立別名,使得在Mybatis配置文件中可以使用別名來(lái)代替完整的Java類型名。使用TypeAliasRegistry可以簡(jiǎn)化Mybatis配置文件的編寫,提高配置文件的可讀性和可維護(hù)性
    2023-05-05
  • Java修改PowerPoint幻燈片批注信息

    Java修改PowerPoint幻燈片批注信息

    這篇文章主要介紹了Java修改PowerPoint幻燈片批注信息,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-05-05
  • 從零開始學(xué)SpringBoot如何開始使用圖文詳解

    從零開始學(xué)SpringBoot如何開始使用圖文詳解

    這篇文章主要介紹了從零開始學(xué)SpringBoot如何開始使用,本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-09-09
  • SpringBoot項(xiàng)目使用aop案例詳解

    SpringBoot項(xiàng)目使用aop案例詳解

    這篇文章主要介紹了SpringBoot項(xiàng)目使用aop的相關(guān)知識(shí),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-04-04
  • 源碼解讀Spring-Integration執(zhí)行過(guò)程

    源碼解讀Spring-Integration執(zhí)行過(guò)程

    Spring-Integration基于Spring,在應(yīng)用程序中啟用了輕量級(jí)消息傳遞,并支持通過(guò)聲明式適配器與外部系統(tǒng)集成,今天主要是看個(gè)簡(jiǎn)單的hello word進(jìn)來(lái)分析下整個(gè)執(zhí)行過(guò)程,感興趣的朋友一起看看吧
    2021-06-06
  • SpringBoot實(shí)現(xiàn)獲取客戶端IP地理位置

    SpringBoot實(shí)現(xiàn)獲取客戶端IP地理位置

    在當(dāng)今互聯(lián)的世界中,了解客戶端的地理位置對(duì)于提供個(gè)性化服務(wù)和增強(qiáng)用戶體驗(yàn)至關(guān)重要,使用本文為大家介紹了SpringBoot獲取客戶端IP地理位置的相關(guān)方法,需要的小伙伴可以參考下
    2023-11-11

最新評(píng)論