Java 中初始化 List 的五種方法
- 1.構造 List 后使用 List.add 初始化
- 2.使用 {{}} 雙括號語法
- 3.使用 Arrays.asList
- 4.使用 Stream (JDK8)
- 5.使用 Lists (JDK9)
- 6.使用guava包的Lists,推薦使用
Java 中經常需要使用到 List,下面簡單介紹幾種常見的初始化方式。
1、構造 List 后使用 List.add 初始化
1 List<String> stringList = new LinkedList<>(); 2 stringList.add("a"); 3 stringList.add("b"); 4 stringList.add("c");
這是最常規的做法,用起來不太方便。
2、使用 {{}} 雙括號語法
1 List<String> stringList = new LinkedList<String>(){{ 2 add("a"); 3 add("b"); 4 add("c"); 5 }};
這種相對方便一些。外層的 {} 定義了一個 LinkedList 的匿名內部類。內層的 {} 的定義了一個實例初始化代碼塊。 這個代碼塊在初始化內部類時執行。所以這里相當於定義了一個匿名內部類,並使用 add 添加元素來初始化。
這種方式有幾個缺點:
- 使用匿名內部類,會有效率上的損失。當然在大多數情況下,這點效率都是可接受的。
- 靜態內部類持有所在外部類的引用。如果需要將 List 返回給到其他地方使用,可能造成內存泄漏。
3、使用 Arrays.asList
1 List<String> stringList = Arrays.asList("a", "b", "c");
這種方式使用了 java.util.Arrays 的靜態方法。寫法上比之前的兩種都更簡潔,也沒有構造匿名內部類的效率問題。
但也有幾點需要注意:
-
Arrays.asList 返回的是 Arrays 的靜態內部類(靜態內部類不持有所在外部類的引用)。
這個內部類繼承自 AbstractList,實現了 RandomAccess,內部使用了一個數組來存儲元素。但是不支持增刪元素。這點需要注意。如果只是使用 Arrays.asList 來初始化常量,那么這點就不算什么問題了。 -
Arrays.asList 的參數如果是基本類型的數組時,需要留意返回值可能和你預期的不同。
1 int[] intArray = new int[]{1, 2, 3}; 2 Integer[] integerArray = new Integer[]{1, 2, 3}; 3 4 List<int[] > intArrayList = Arrays.asList(intArray); 5 List<Integer> integerList = Arrays.asList(integerArray); 6 List<Integer> integerList2 = Arrays.asList(1, 2, 3);
這里 Arrays.asList(intArray) 的返回值是 List<int[]> 而不是 List。這一點也算不上問題,只是使用時需要留意。如果能在 Java 中做到盡量使用 List 和 Integer,盡量避免使用 int 等基本類型和 [] 這種較為底層的數據結構即可避免。
雖然本文是在講初始化 List,但這里的 {{}} 雙括號語法同樣可用於初始化 Map 等其他眾多類型。相對而言,Arrays.asList 就只能用於初始化 List 類型了。
4、使用 Stream (JDK8)
1 List<String> list = Stream.of("a", "b","c").collect(Collectors.toList());
使用了 JDK8 的 Stream 來初始化。 單純初始化 List,使用 Stream 有點大材小用了。
5、使用 Lists (JDK9)
1 List<String> list = Lists.newArrayList("a", "b", "c");
這個和 Arrays.asList 一樣簡潔清晰。
5、使用 guava包的Lists
使用方法同上,提出這種方法主要是很多項目還是java8,沒法直接用java9的List。
推薦使用。
1 List<Integer> integers = Lists.newArrayList(1, 2, 3);