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

Java實戰(zhàn)小技巧之數組與list互轉

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

前言

這個考題比較常見,也比較簡單,難道就這也有什么可以說到的門路不成?

接下來本文好好的說一說它的幾種實現姿勢,總有一款你喜歡的

I. 數組轉 List

1. Array.asList

這個考題太簡單了,直接使用Array.asList不就完事了么,比如

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

數組轉 list,so easy!!!

真的就這么簡單么???

且看下面這一段代碼

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

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

1.1 知識點

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

2. new ArrayList

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

為了減少在代碼里面下毒的可能性,不妨使用下面這種方式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);

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

2.1 避雷預警

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

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

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

禁止修改:

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

列表拷貝

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

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

3. Collections.addAll

第三種方式借助 jdk 提供的容器工具類Collections來實現

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

    // 因為列表為我們定義的ArrayList,因此可以對它進行增刪改
    out.add("hello");
    System.out.println(out);
}

原則上是比較推薦這種方式來實現的,至于為啥?看下源碼實現

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

這段代碼的實現是不是非常眼熟,如果讓我們自己來寫,也差不多會寫成這樣吧,簡單直觀高效,完美

II. 列表轉數組

不同于數組轉列表的幾種玩法,列表轉數組就簡單多了,直接調用List.toArray

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

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

III. 小結

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

核心知識點小結如下

數組轉 list:

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

列表轉數組

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

總結

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

相關文章

  • mybatis如何實現in傳入數組查詢

    mybatis如何實現in傳入數組查詢

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

    Mybatis中的自定義映射resultMap

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

    java對象拷貝詳解及實例

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

    Java求兩個正整數的最大公約數和最小公倍數

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

    Mybatis中TypeAliasRegistry的作用及使用方法

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

    Java修改PowerPoint幻燈片批注信息

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

    從零開始學SpringBoot如何開始使用圖文詳解

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

    SpringBoot項目使用aop案例詳解

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

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

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

    SpringBoot實現獲取客戶端IP地理位置

    在當今互聯的世界中,了解客戶端的地理位置對于提供個性化服務和增強用戶體驗至關重要,使用本文為大家介紹了SpringBoot獲取客戶端IP地理位置的相關方法,需要的小伙伴可以參考下
    2023-11-11

最新評論