Java實(shí)戰(zhàn)小技巧之?dāng)?shù)組與list互轉(zhuǎn)
前言
這個考題比較常見,也比較簡單,難道就這也有什么可以說到的門路不成?
接下來本文好好的說一說它的幾種實(shí)現(xiàn)姿勢,總有一款你喜歡的
I. 數(shù)組轉(zhuǎn) 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); }
數(shù)組轉(zhuǎn) 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
有興趣的小伙伴可以看一下源碼實(shí)現(xiàn)方式,通過Arrays.asList創(chuàng)建的 List,雖說也命名是ArrayList,但是它的全路徑為 java.util.Arrays.ArrayList, 不支持add, remove等操作(所以下次再有面試官問 ArrayList 的知識點(diǎn)時,就可以反問一句,老哥你指的是哪個 ArrayList😝,逼格是不是立馬拉起來)
1.1 知識點(diǎn)
通過Arrays.asList創(chuàng)建的列表,不允許新增,刪除元素;但是可以更新列表中元素的值
2. new ArrayList
上面的數(shù)組轉(zhuǎn) list 方式雖然是最簡單的,但不一定是合適的,特別是當(dāng)我們可能對轉(zhuǎn)換后的 list 進(jìn)行操作時,可能埋坑(而且這種坑還非常隱晦,代碼層面上很難發(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);
通過上面這種方式創(chuàng)建的 List,就是我們熟知的ArrayList了
2.1 避雷預(yù)警
看到上面這個使用姿勢,就很容易想到一個常見的踩雷點(diǎn),比如我們的應(yīng)用中,有一個全局共享的配置列表,張三需要拿 id 為奇數(shù)的配置,李四拿 id 為偶數(shù)的配置,然后他們都是這么做的
list.removeIf(s -> s.id % 2 == 0);
然后跑了一次之后發(fā)現(xiàn)這個全局的列表清空了,這就是典型的沒有做好資源隔離的 case 了,針對這種場景,要么是限制使用方,直接針對全局的資源進(jìn)行修改,要么就是使用方拿到的是一個隔離的備份
禁止修改:
- 使用不可變的容器,如前面提到的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來實(shí)現(xiàn)
@Test public void ary2listV3() { String[] ary = new String[]{ "1", "a"}; // 創(chuàng)建列表,并指定長度,避免可能產(chǎn)生的擴(kuò)容 List<String> out = new ArrayList<>(ary.length); // 實(shí)現(xiàn)數(shù)組添加到列表中 Collections.addAll(out, ary); // 因?yàn)榱斜頌槲覀兌x的ArrayList,因此可以對它進(jìn)行增刪改 out.add("hello"); System.out.println(out); }
原則上是比較推薦這種方式來實(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)是不是非常眼熟,如果讓我們自己來寫,也差不多會寫成這樣吧,簡單直觀高效,完美
II. 列表轉(zhuǎn)數(shù)組
不同于數(shù)組轉(zhuǎn)列表的幾種玩法,列表轉(zhuǎn)數(shù)組就簡單多了,直接調(diào)用List.toArray
List<String> list = Arrays.asList("a", "b", "c"); // 返回的是Object[] 數(shù)組 Object[] cell = list.toArray(); // 如果需要指定數(shù)組類型,可以傳一個指定各類型的空的數(shù)組 // 也可以傳一個與目標(biāo)列表長度相等的數(shù)組,這樣會將列表中的元素拷貝到這個數(shù)組中 String[] strCell = list.toArray(new String[]{});
III. 小結(jié)
今天的博文主題是數(shù)組與列表的互轉(zhuǎn),雖說題目簡單,但是實(shí)現(xiàn)方式也是多種,需要搞清楚它們之間的本質(zhì)區(qū)別,一不小心就可能采坑,而最簡單的地方掉坑里,往往是最難發(fā)現(xiàn)和爬出來的
核心知識點(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)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- java中String,數(shù)組,ArrayList三者之間的轉(zhuǎn)換
- java 數(shù)組轉(zhuǎn)list的兩種方式
- Java如何把數(shù)組轉(zhuǎn)換為ArrayList
- Java中數(shù)組轉(zhuǎn)List的三種方法與對比分析
- 淺談java 字符串,字符數(shù)組,list間的轉(zhuǎn)化
- Java ArrayList 數(shù)組之間相互轉(zhuǎn)換
- Java中List與數(shù)組相互轉(zhuǎn)換實(shí)例分析
- java list與數(shù)組之間的轉(zhuǎn)換詳細(xì)解析
- JAVA中l(wèi)ist,set,數(shù)組之間的轉(zhuǎn)換詳解
- Java 數(shù)組轉(zhuǎn)List的四種方式小結(jié)
相關(guān)文章
mybatis如何實(shí)現(xiàn)in傳入數(shù)組查詢
這篇文章主要介紹了mybatis如何實(shí)現(xiàn)in傳入數(shù)組查詢方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-10-10Java求兩個正整數(shù)的最大公約數(shù)和最小公倍數(shù)
這篇文章主要介紹了輸入兩個正整數(shù)m和n,求其最大公約數(shù)和最小公倍數(shù),需要的朋友可以參考下2017-02-02Mybatis中TypeAliasRegistry的作用及使用方法
Mybatis中的TypeAliasRegistry是一個類型別名注冊表,它的作用是為Java類型建立別名,使得在Mybatis配置文件中可以使用別名來代替完整的Java類型名。使用TypeAliasRegistry可以簡化Mybatis配置文件的編寫,提高配置文件的可讀性和可維護(hù)性2023-05-05從零開始學(xué)SpringBoot如何開始使用圖文詳解
這篇文章主要介紹了從零開始學(xué)SpringBoot如何開始使用,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-09-09源碼解讀Spring-Integration執(zhí)行過程
Spring-Integration基于Spring,在應(yīng)用程序中啟用了輕量級消息傳遞,并支持通過聲明式適配器與外部系統(tǒng)集成,今天主要是看個簡單的hello word進(jìn)來分析下整個執(zhí)行過程,感興趣的朋友一起看看吧2021-06-06SpringBoot實(shí)現(xiàn)獲取客戶端IP地理位置
在當(dāng)今互聯(lián)的世界中,了解客戶端的地理位置對于提供個性化服務(wù)和增強(qiáng)用戶體驗(yàn)至關(guān)重要,使用本文為大家介紹了SpringBoot獲取客戶端IP地理位置的相關(guān)方法,需要的小伙伴可以參考下2023-11-11