1. 概述

在Java中,有时我们需要创建一个小型临时列表或将数组转换为列表以方便使用。Java为此提供了一些辅助方法。

本教程将比较初始化小型临时数组的两种主要方式:List.of()Arrays.asList()

2. 使用 Arrays.asList()

Arrays.asList()(自Java 1.2引入)简化了列表对象的创建,它是Java集合框架的一部分。它接受数组作为输入,并根据提供的数组创建一个列表:

Integer[] array = new Integer[]{1, 2, 3, 4};
List<Integer> list = Arrays.asList(array);
assertThat(list).containsExactly(1,2,3,4);

如图所示,创建一个简单的整数列表非常容易。

2.1. 返回列表的不支持操作

asList() 方法返回的是固定大小的列表,因此添加和删除新元素会抛出 UnsupportedOperationException

List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
assertThrows(UnsupportedOperationException.class, () -> list.add(6));

List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
assertThrows(UnsupportedOperationException.class, () -> list.remove(1));

2.2. 与数组一起工作

需要注意的是,列表不会复制输入数组。相反,它使用 List 接口包装原始数组,因此对数组的更改也会反映到列表上:

Integer[] array = new Integer[]{1,2,3};
List<Integer> list = Arrays.asList(array);
array[0] = 1000;
assertThat(list.get(0)).isEqualTo(1000);

2.3. 修改返回的列表

此外,Arrays.asList() 返回的列表是可变的。这意味着我们可以更改列表中的单个元素:

List<Integer> list = Arrays.asList(1, 2, 3, 4);
list.set(1, 1000);
assertThat(list.get(1)).isEqualTo(1000);

这最终可能导致意外的副作用,导致难以查找的错误。当提供数组作为输入时,对列表的更改也将反映到数组上:

Integer[] array = new Integer[]{1, 2, 3};
List<Integer> list = Arrays.asList(array);
list.set(0,1000);
assertThat(array[0]).isEqualTo(1000);

让我们看看另一种创建列表的方法。

3. 使用 List.of()

Arrays.asList() 相比,Java 9引入了一个更方便的方法:List.of()Java 9 初始化列表一行式)。它创建不可修改的列表实例:

String[] array = new String[]{"one", "two", "three"};
List<String> list = List.of(array);
assertThat(list).containsExactly("two", "two", "three");

3.1. 与 Arrays.asList() 的区别

Arrays.asList() 的主要区别在于,List.of() 返回的是基于提供的输入数组的不可变列表副本。因此,对原始数组的更改不会反映到返回的列表上:

String[] array = new String[]{"one", "two", "three"};
List<String> list = List.of(array);
array[0] = "thousand";
assertThat(list.get(0)).isEqualTo("one");

此外,我们不能修改列表中的元素。尝试这样做会抛出 UnsupportedOperationException

List<String> list = List.of("one", "two", "three");
assertThrows(UnsupportedOperationException.class, () -> list.set(1, "four"));

3.2. null

还应注意,List.of() 不允许输入 null 值,否则会抛出 NullPointerException

assertThrows(NullPointerException.class, () -> List.of("one", null, "two"));

4. 总结

这篇短文探讨了Java中使用 List.of()Arrays.asList() 创建列表的方法。

如往常一样,完整的示例代码可在 GitHub 上找到。