在 Java 中初始化 List 的五种方法
轉(zhuǎn)載自??在 Java 中初始化 List 的五種方法
Java 中經(jīng)常需要使用到 List,下面簡單介紹幾種常見的初始化方式。
1.構(gòu)造?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"); }};這種方式相對方便了一些。
外層的?{}?定義了一個(gè) LinkedList 的匿名內(nèi)部類。內(nèi)層的?{}?的定義了一個(gè)實(shí)例初始化代碼塊。 這個(gè)代碼塊在初始化內(nèi)部類時(shí)執(zhí)行。所以這里相當(dāng)于定義了一個(gè)匿名內(nèi)部類,并使用?add?添加元素來初始化。
這種方式有幾個(gè)缺點(diǎn):
-
使用匿名內(nèi)部類,會有效率上的損失。當(dāng)然在大多數(shù)情況下,這點(diǎn)效率都是可接受的。
-
靜態(tài)內(nèi)部類持有所在外部類的引用。如果需要將 List 返回給到其他地方使用,可能造成內(nèi)存泄漏。
?
3.使用?Arrays.asList
List<String> stringList = Arrays.asList("a",?"b",?"c");這種方式使用了?java.util.Arrays?的靜態(tài)方法。寫法上比之前的兩種都更簡潔,也沒有構(gòu)造匿名內(nèi)部類的效率問題。
但也有幾點(diǎn)需要注意:
-
Arrays.asList?返回的是?Arrays?的靜態(tài)內(nèi)部類(靜態(tài)內(nèi)部類不持有所在外部類的引用)。
-
這個(gè)內(nèi)部類繼承自?AbstractList,實(shí)現(xiàn)了?RandomAccess,內(nèi)部使用了一個(gè)數(shù)組來存儲元素。但是不支持增刪元素。這點(diǎn)需要注意。如果只是使用?Arrays.asList?來初始化常量,那么這點(diǎn)就不算什么問題了。
-
-
Arrays.asList?的參數(shù)如果是基本類型的數(shù)組時(shí),需要留意返回值可能和你預(yù)期的不同。
這里?Arrays.asList(intArray)?的返回值是?List<int[]>?而不是?List<Integer>。這一點(diǎn)也算不上問題,只是使用時(shí)需要留意。如果能在 Java 中做到盡量使用 List 和 Integer,盡量避免使用 int 等基本類型和?[]?這種較為底層的數(shù)據(jù)結(jié)構(gòu)即可避免。
雖然本文是在講初始化?List,但這里的?{{}}?雙括號語法同樣可用于初始化?Map?等其他眾多類型。相對而言,Arrays.asList?就只能用于初始化?List?類型了。
?
4. 使用?Stream?(JDK8)
List<String>?list?= Stream.of("a",?"b",?"c").collect(Collectors.toList());使用了 JDK8 的 Stream 來初始化。 單純初始化 List,使用 Stream 有點(diǎn)大材小用了。
?
5. 使用?Lists?(JDK9)
List<String>?list?= Lists.newArrayList("a",?"b",?"c");這個(gè)和?Arrays.asList?一樣簡潔清晰。
總結(jié)
以上是生活随笔為你收集整理的在 Java 中初始化 List 的五种方法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 深入理解TCP/IP协议-TCP建立与终
- 下一篇: 红米饭南瓜汤是什么歌 红米饭南瓜汤原唱