Arrays.asList():使用指南

waynaqua發表於2023-09-19

Arrays.asList() 是一個 Java 的靜態方法,它可以把一個陣列或者多個引數轉換成一個 List 集合。這個方法可以作為陣列和集合之間的橋樑,方便我們使用集合的一些方法和特性。本文將介紹 Arrays.asList() 的語法、應用場景、坑點和總結。

  • 語法
  • 應用場景
  • 坑點
  • 總結

語法

Arrays.asList() 的語法格式如下:

public static <T> List<T> asList(T... a)

這個方法接受一個泛型引數 T,表示陣列或者引數的型別。T 必須是一個引用型別,不能是一個基本型別,例如 int, double, char 等。如果傳入一個基本型別的陣列,Arrays.asList() 會把它當作一個 Object 型別的元素,而不是把它的每個元素當作 Object 型別。這樣就會導致返回的 List 只有一個元素,就是原始陣列本身。

Arrays.asList() 返回的 List 是一個 Arrays 類的內部類,它持有一個對原始陣列的引用。這意味著對 List 的修改會反映到陣列上,反之亦然。但是,這個 List 的大小是固定的,不能進行增加或者刪除的操作,否則會丟擲 UnsupportedOperationException 異常。

Arrays.asList() 返回的 List 是可序列化的,並且實現了 RandomAccess 介面,表示它支援隨機訪問。

應用場景

Arrays.asList() 可以用在以下幾種場景中:

  • 當我們需要建立一個不需要改變大小或者內容的 List 集合時,我們可以使用 Arrays.asList() 來快速地初始化一些元素。例如:
// 使用 Arrays.asList() 建立一個不可變的 List
List<String> list = Arrays.asList("a", "b", "c");
System.out.println(list); // [a, b, c]
  • 當我們需要建立一個空的或者單元素的 List 集合時,我們可以使用 Arrays.asList() 來簡化程式碼。例如:
// 使用 Arrays.asList() 建立一個不可變的空 List
List<String> emptyList = Arrays.asList();
System.out.println(emptyList); // []

// 使用 Arrays.asList() 建立一個不可變的單元素 List
List<String> singletonList = Arrays.asList("a");
System.out.println(singletonList); // [a]
  • 當我們需要從一個陣列或者其他集合類建立一個不可變的 List 集合時,我們可以使用 Arrays.asList() 來方便地轉換。例如:
// 使用 Arrays.asList() 從陣列建立一個不可變的 List
String[] array = {"a", "b", "c"};
List<String> listFromArray = Arrays.asList(array);
System.out.println(listFromArray); // [a, b, c]

// 使用 Arrays.asList() 從其他集合類建立一個不可變的 List
Set<String> set = new HashSet<>();
set.add("a");
set.add("b");
set.add("c");
List<String> listFromSet = Arrays.asList(set.toArray(new String[0]));
System.out.println(listFromSet); // [a, b, c]
  • 當我們需要使用一些集合類的方法或者特性時,我們可以使用 Arrays.asList() 來把陣列轉換成集合。例如:
// 使用 Arrays.asList() 把陣列轉換成集合,並使用 Collections 類的方法
String[] array = {"a", "b", "c"};
List<String> list = Arrays.asList(array);
Collections.sort(list); // 對集合進行排序
System.out.println(list); // [a, b, c]
Collections.reverse(list); // 對集合進行反轉
System.out.println(list); // [c, b, a]
Collections.shuffle(list); // 對集合進行隨機打亂
System.out.println(list); // [b, a, c] 或者其他隨機順序

// 使用 Arrays.asList() 把陣列轉換成集合,並使用 Stream API
String[] array = {"a", "b", "c"};
List<String> list = Arrays.asList(array);
list.stream().forEach(System.out::println); // 對集合進行遍歷並列印每個元素
list.stream().map(String::toUpperCase).forEach(System.out::println); // 對集合進行對映並列印每個元素的大寫形式
list.stream().filter(s -> s.startsWith("a")).forEach(System.out::println); // 對集合進行過濾並列印以 a 開頭的元素

坑點

Arrays.asList() 也有一些坑點,需要注意以下幾點:

  • Arrays.asList() 不支援基本資料型別的陣列,因為它只能接受 Object 型別的引數或者陣列。基本資料型別(如 int, double, char 等)不是 Object 的子類,所以不能直接作為 Arrays.asList() 的引數。如果傳入一個基本資料型別的陣列,Arrays.asList() 會把它當作一個 Object 型別的元素,而不是把它的每個元素當作 Object 型別。這樣就會導致返回的 List 只有一個元素,就是原始陣列本身。

如果想要把一個基本資料型別的陣列轉換成 List,有以下幾種方法:

  • 使用迴圈遍歷陣列,並把每個元素新增到 List 中。這樣可以利用自動裝箱(autoboxing)的特性,把基本資料型別轉換成對應的包裝類(如 Integer, Double, Character 等)。
  • 使用 Java 8 中的 Stream API,可以用一行程式碼實現陣列到 List 的轉換。可以使用 Arrays.stream() 或者 IntStream.of() 等方法,然後呼叫 boxed() 和 collect() 方法。
  • 使用第三方庫,如 Guava 或者 Apache Commons Lang,它們提供了一些工具類和方法來處理基本資料型別的陣列和集合。

示例程式碼如下:

// 使用迴圈遍歷陣列,並把每個元素新增到 List 中
int[] array = {1, 2, 3};
List<Integer> list = new ArrayList<>();
for (int num : array) {
    list.add(num); // 利用自動裝箱
}
System.out.println(list); // [1, 2, 3]

// 使用 Stream API 實現陣列到 List 的轉換
int[] array = {1, 2, 3};
List<Integer> list = Arrays.stream(array).boxed().collect(Collectors.toList());
System.out.println(list); // [1, 2, 3]

// 使用 Guava 實現陣列到 List 的轉換
int[] array = {1, 2, 3};
List<Integer> list = Ints.asList(array);
System.out.println(list); // [1, 2, 3]
  • Arrays.asList() 返回的 List 是不可變的,也就是說,不能對它進行增加或者刪除的操作,否則會丟擲 UnsupportedOperationException 異常。這是因為 Arrays.asList() 返回的 List 是一個 Arrays 類的內部類,它沒有實現 add() 和 remove() 等方法。

如果想要建立一個可變的 List 集合,有以下幾種方法:

  • 使用 ArrayList 的構造器,並把 Arrays.asList() 作為引數傳入。這樣可以建立一個新的 ArrayList 物件,並複製原始陣列中的元素。例如:
// 使用 ArrayList 的構造器建立一個可變的 List
String[] array = {"a", "b", "c"};
List<String> list = new ArrayList<>(Arrays.asList(array));
System.out.println(list); // [a, b, c]
list.add("d"); // 可以增加元素
System.out.println(list); // [a, b, c, d]
  • 使用 Java 8 中的 Stream API,可以用一行程式碼實現陣列到 List 的轉換。可以使用 Arrays.stream() 或者 IntStream.of() 等方法,然後呼叫 collect() 方法。例如:
// 使用 Stream API 實現陣列到 List 的轉換
int[] array = {1, 2, 3};
List<Integer> list = Arrays.stream(array).boxed().collect(Collectors.toList());
System.out.println(list); // [1, 2, 3]
list.add(4); // 可以增加元素
System.out.println(list); // [1, 2, 3, 4]

總結

Arrays.asList() 是一個簡單而有用的方法,它可以幫助我們把陣列轉換成 List 集合。但是它也有一些限制和注意事項,我們應該根據具體的需求和場景來選擇合適的方法。希望這篇文章對你有所幫助,謝謝您的閱讀。?

關注公眾號【waynblog】每週分享技術乾貨、開源專案、實戰經驗、國外優質文章翻譯等,您的關注將是我的更新動力!