從陣列建立列表

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));
    

    檢視演示