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

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),也比較簡(jiǎn)單,難道就這也有什么可以說(shuō)到的門(mén)路不成?

接下來(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è)常見(jiàn)的踩雷點(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)寫(xiě),也差不多會(huì)寫(xiě)成這樣吧,簡(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),獲取到的列表支持新增、刪除
  • 推薦寫(xiě)法 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如何通過(guò)接口實(shí)現(xiàn)sql執(zhí)行原理解析

    Mybatis如何通過(guò)接口實(shí)現(xiàn)sql執(zhí)行原理解析

    為了簡(jiǎn)化MyBatis的使用,MyBatis提供了接口方式自動(dòng)化生成調(diào)用過(guò)程,可以大大簡(jiǎn)化MyBatis的開(kāi)發(fā),下面這篇文章主要給大家介紹了關(guān)于Mybatis如何通過(guò)接口實(shí)現(xiàn)sql執(zhí)行原理解析的相關(guān)資料,需要的朋友可以參考下
    2023-01-01
  • SpringCloud微服務(wù)熔斷器使用詳解

    SpringCloud微服務(wù)熔斷器使用詳解

    這篇文章主要介紹了Spring Cloud Hyxtrix的基本使用,它是Spring Cloud中集成的一個(gè)組件,在整個(gè)生態(tài)中主要為我們提供服務(wù)隔離,服務(wù)熔斷,服務(wù)降級(jí)功能,本文給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2022-09-09
  • 聊聊springboot靜態(tài)資源加載的規(guī)則

    聊聊springboot靜態(tài)資源加載的規(guī)則

    這篇文章主要介紹了springboot靜態(tài)資源加載的規(guī)則,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • SpringBoot返回Json對(duì)象報(bào)錯(cuò)(返回對(duì)象為空{(diào)})

    SpringBoot返回Json對(duì)象報(bào)錯(cuò)(返回對(duì)象為空{(diào)})

    本文主要介紹介紹了SpringBoot返回Json對(duì)象報(bào)錯(cuò)(返回對(duì)象為空{(diào)}),文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • Java API方式調(diào)用Kafka各種協(xié)議的方法

    Java API方式調(diào)用Kafka各種協(xié)議的方法

    本篇文章主要介紹了Java API方式調(diào)用Kafka各種協(xié)議的方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-09-09
  • SpringBoot屬性注入的多種方式實(shí)例

    SpringBoot屬性注入的多種方式實(shí)例

    在 SpringBoot中,提供了一種新的屬性注入方式,支持各種java基本數(shù)據(jù)類型及復(fù)雜類型的注入,下面這篇文章主要給大家介紹了關(guān)于SpringBoot屬性注入的多種方式,需要的朋友可以參考下
    2021-10-10
  • MybatisPlus保存、讀取MySQL中的json字段失敗問(wèn)題及解決

    MybatisPlus保存、讀取MySQL中的json字段失敗問(wèn)題及解決

    這篇文章主要介紹了MybatisPlus保存、讀取MySQL中的json字段失敗問(wèn)題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-07-07
  • Java源碼解析之接口List

    Java源碼解析之接口List

    今天帶大家復(fù)習(xí)Java基礎(chǔ)的一些知識(shí)點(diǎn),對(duì)接口List進(jìn)行了詳細(xì)的解析,對(duì)正在學(xué)習(xí)Java的小伙伴們有很好地幫助,需要的朋友可以參考下
    2021-05-05
  • Java 自定義Spring框架與核心功能詳解

    Java 自定義Spring框架與核心功能詳解

    Spring框架是由于軟件開(kāi)發(fā)的復(fù)雜性而創(chuàng)建的。Spring使用的是基本的JavaBean來(lái)完成以前只可能由EJB完成的事情。然而,Spring的用途不僅僅限于服務(wù)器端的開(kāi)發(fā)
    2021-10-10
  • 代理角色java設(shè)計(jì)模式之靜態(tài)代理詳細(xì)介紹

    代理角色java設(shè)計(jì)模式之靜態(tài)代理詳細(xì)介紹

    查了好多資料,發(fā)現(xiàn)還是不全,干脆自己整理吧,至少保證在我的做法正確的,以免誤導(dǎo)讀者,也是給自己做個(gè)記錄吧!
    2013-05-05

最新評(píng)論

伊川县| 卢龙县| 图们市| 崇礼县| 长宁区| 邮箱| 达日县| 三台县| 本溪| 烟台市| 昭平县| 开远市| 红原县| 周宁县| 胶南市| 英吉沙县| 鸡泽县| 革吉县| 桐城市| 双流县| 镇雄县| 兴安盟| 荃湾区| 武强县| 博罗县| 吉安县| 台湾省| 隆尧县| 莱西市| 大埔县| 舟山市| 尚义县| 龙岩市| 丰顺县| 太白县| 阳谷县| 遂平县| 赫章县| 眉山市| 邯郸市| 长白|