2021-06-01

在 Java 中初始化 List 的五種方法

在 Java 中初始化List的五種方法

? ? ?1.構造List后使用List.add初始化

? ? ??2.使用{{}}雙括號語法

? ? ? 3.使用Arrays.asList

? ? ??4. 使用Stream(JDK8)

? ? ? ?5. 使用Lists(JDK9)

參考

樂字節(jié)

在 Java 中初始化List的五種方法

Java 中經(jīng)常需要使用到 List,下面簡單介紹幾種常見的初始化方式。

1.構造List后使用List.add初始化

? ?List<String> stringList = new LinkedList<>();

? ? ? stringList.add("a");

? ? ? stringList.add("b");

? ? ? ?stringList.add("c");

這是最常規(guī)的做法,用起來不太方便。

2.使用{{}}雙括號語法

? ?List<String> stringList = new LinkedList<String>(){{

? ? ? ?add("a");

? ? ? ?add("b");

? ? ? ? add("c");

? ?}};

這種方式相對方便了一些。

? ? ? ?外層的{}定義了一個 LinkedList 的匿名內(nèi)部類。內(nèi)層的{}的定義了一個實例初始化代碼塊。 這個代碼塊在初始化內(nèi)部類時執(zhí)行。所以這里相當于定義了一個匿名內(nèi)部類,并使用add添加元素來初始化。

這種方式有幾個缺點:

? ? ? 使用匿名內(nèi)部類,會有效率上的損失。當然在大多數(shù)情況下,這點效率都是可接受的。

? ? ? ?靜態(tài)內(nèi)部類持有所在外部類的引用。如果需要將 List 返回給到其他地方使用,可能造成內(nèi)存泄漏。

3.使用Arrays.asList

? ?List<String> stringList = Arrays.asList("a", "b", "c");

? ? ? 這種方式使用了java.util.Arrays的靜態(tài)方法。寫法上比之前的兩種都更簡潔,也沒有構造匿名內(nèi)部類的效率問題。

但也有幾點需要注意:

Arrays.asList返回的是Arrays的靜態(tài)內(nèi)部類(靜態(tài)內(nèi)部類不持有所在外部類的引用)。

? ? ? ?這個內(nèi)部類繼承自AbstractList,實現(xiàn)了RandomAccess,內(nèi)部使用了一個數(shù)組來存儲元素。但是不支持增刪元素。這點需要注意。如果只是使用Arrays.asList來初始化常量,那么這點就不算什么問題了。

Arrays.asList的參數(shù)如果是基本類型的數(shù)組時,需要留意返回值可能和你預期的不同。

? ? iint[] intArray = new int[]{1, 2, 3};

? ? Integer[] integerArray = new Integer[]{1, 2, 3};

? ? List<int[] > intArrayList = Arrays.asList(intArray);

? ? List<Integer> integerList = Arrays.asList(integerArray);

? ? ?List<Integer> integerList2 = Arrays.asList(1, 2, 3);

? ? ? ?這里Arrays.asList(intArray)的返回值是List<int[]>而不是List<Integer>。這一點也算不上問題,只是使用時需要留意。如果能在 Java 中做到盡量使用 List 和 Integer,盡量避免使用 int 等基本類型和[]這種較為底層的數(shù)據(jù)結構即可避免。

說點題外話:

? ? ? ?Java 終究還是不能稱之為完全面向?qū)ο?。畢竟保留了基本?shù)據(jù)類型這種東西。誠然基本數(shù)據(jù)類型使用時比相應的封裝類型效率要更高。但也給使用過程中帶來了一些困惑:到底該用基本類型,還是封裝類型,什么時候該用這個,什么時候該用哪個?雖然 Java 提供給了用戶更多的選擇,但有種將難題丟給用戶的感覺。在我看來,Java 相比的 C++ 一個優(yōu)點,就是很多事情有了限制,有較為明確清晰的定義,減少了模棱兩可,更容易理解。但基本數(shù)據(jù)類型這里,感覺還是 Java 作為一門改善了 C++ 缺點的語言留下的一些影子。

? ? ? ?雖然本文是在講初始化List,但這里的{{}}雙括號語法同樣可用于初始化Map等其他眾多類型。相對而言,Arrays.asList就只能用于初始化List類型了。

4. 使用Stream(JDK8)

? ? ? ?List<String> list = Stream.of("a", "b", "c").collect(Collectors.toList());

使用了 JDK8 的 Stream 來初始化。 單純初始化 List,使用 Stream 有點大材小用了。

5. 使用Lists(JDK9)

? ? ? ?List<String> list = Lists.newArrayList("a", "b", "c");

這個和Arrays.asList一樣簡潔清晰。

此文章轉(zhuǎn)自樂字節(jié)。

?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容