從陣列建立列表
該 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));