從陣列建立列表
該 Arrays.asList()
方法可用於返回一個包含給定的陣列的元件固定大小 List
。生成的 List
將與陣列的基本型別具有相同的引數型別。
String[] stringArray = {"foo", "bar", "baz"};
List<String> stringList = Arrays.asList(stringArray);
注意 :此列表由原始陣列的( 檢視 ) 支援,這意味著對列表的任何更改都將更改陣列,反之亦然。但是,對列表的更改將改變其大小(因此更改陣列長度)將引發異常。
要建立列表的副本,請使用 java.util.ArrayList
的建構函式,將 Collection
作為引數:
Version >= Java SE 5
String[] stringArray = {"foo", "bar", "baz"};
List<String> stringList = new ArrayList<String>(Arrays.asList(stringArray));
Version >= Java SE 7
在 Java SE 7 及更高版本中,可以使用一對尖括號 <>
(空型別引數集),稱為 Diamond 。編譯器可以從上下文中確定型別引數。這意味著在呼叫 ArrayList
的建構函式時可以省略型別資訊,並且它將在編譯期間自動推斷。這稱為 Type Inference ,它是 Java Generics 的一部分。
// Using Arrays.asList()
String[] stringArray = {"foo", "bar", "baz"};
List<String> stringList = new ArrayList<>(Arrays.asList(stringArray));
// Using ArrayList.addAll()
String[] stringArray = {"foo", "bar", "baz"};
ArrayList<String> list = new ArrayList<>();
list.addAll(Arrays.asList(stringArray));
// Using Collections.addAll()
String[] stringArray = {"foo", "bar", "baz"};
ArrayList<String> list = new ArrayList<>();
Collections.addAll(list, stringArray);
關於 Diamond 的一點值得注意的是它不能與 Anonymous Classes一起使用。
Version >= Java SE 8
// Using Streams
int[] ints = {1, 2, 3};
List<Integer> list = Arrays.stream(ints).boxed().collect(Collectors.toList());
String[] stringArray = {"foo", "bar", "baz"};
List<Object> list = Arrays.stream(stringArray).collect(Collectors.toList());
與使用 Arrays.asList()
方法相關的重要說明
-
這個方法返回
List
,這是Arrays$ArrayList
的例項(Arrays
的靜態內部類)而不是java.util.ArrayList
。由此產生的List
具有固定的尺寸。這意味著,不支援新增或刪除元素,並將丟擲一個UnsupportedOperationException
:stringList.add("something"); // throws java.lang.UnsupportedOperationException
-
通過將支援陣列的
List
傳遞給新List
的建構函式,可以建立一個新的List
。這將建立一個新的資料副本,該副本具有可更改的大小,並且不受原始陣列的支援:List<String> modifiableList = new ArrayList<>(Arrays.asList("foo", "bar"));
-
在原始陣列(例如
int[]
)上呼叫<T> List<T> asList(T... a)
將產生一個List<int[]>
,其唯一的元素是源基本陣列, 而不是源陣列的實際元素。這種行為的原因是原始型別不能用於代替泛型型別引數,因此整個原始陣列在這種情況下替換泛型型別引數。為了將原始陣列轉換為
List
,首先,將原始陣列轉換為相應包裝型別的陣列(即在Integer[]
上呼叫Arrays.asList
而不是int[]
)。因此,這將列印
false
:int[] arr = {1, 2, 3}; // primitive array of int System.out.println(Arrays.asList(arr).contains(1));
另一方面,這將列印
true
:Integer[] arr = {1, 2, 3}; // object array of Integer (wrapper for int) System.out.println(Arrays.asList(arr).contains(1));
這也將列印
true
,因為該陣列將被解釋為Integer[]
):System.out.println(Arrays.asList(1,2,3).contains(1));