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中TypeAliasRegistry的作用及使用方法
Mybatis中的TypeAliasRegistry是一個類型別名注冊表,它的作用是為Java類型建立別名,使得在Mybatis配置文件中可以使用別名來代替完整的Java類型名。使用TypeAliasRegistry可以簡化Mybatis配置文件的編寫,提高配置文件的可讀性和可維護性2023-05-05源碼解讀Spring-Integration執(zhí)行過程
Spring-Integration基于Spring,在應用程序中啟用了輕量級消息傳遞,并支持通過聲明式適配器與外部系統(tǒng)集成,今天主要是看個簡單的hello word進來分析下整個執(zhí)行過程,感興趣的朋友一起看看吧2021-06-06