由于int是原始类型,因此我们无法使用 List<int>
,而只能使用 List<Integer>
。
Java 16
Java 16 在Stream API中引入了一个名为toList()
的新方法。这个方便的方法返回一个不可修改的List,其中包含流元素。因此,尝试向列表中添加新元素将只会导致UnsupportedOperationException
异常。
int[] ints = new int[] {1,2,3,4,5};
Arrays.stream(ints).boxed().toList();
Java 8(整型数组)
int[] ints = new int[] {1,2,3,4,5}
List<Integer> list11 =Arrays.stream(ints).boxed().collect(Collectors.toList())
Java 8及以下版本(整数数组)
Integer[] integers = new Integer[] {1,2,3,4,5};
List<Integer> list21 = Arrays.asList(integers);
List<Integer> list22 = new ArrayList<>(Arrays.asList(integers));
List<Integer> list23 = Arrays.stream(integers).collect(Collectors.toList());
需要 ArrayList 而不是 List 吗?
如果我们想要特定的 List
实现,例如 ArrayList
,那么可以使用 toCollection
方法:
ArrayList<Integer> list24 = Arrays.stream(integers)
.collect(Collectors.toCollection(ArrayList::new))
为什么list21
无法进行结构修改?
当我们使用Arrays.asList
时,返回的列表大小是固定的,因为返回的列表不是java.util.ArrayList
,而是在java.util.Arrays
内部定义的一个私有静态类。因此,如果我们向返回的列表添加或删除元素,将会抛出UnsupportedOperationException
异常。所以当我们想要修改列表时,应该选择list22
。如果我们使用Java8,则还可以选择list23
。
明确一点,list21
可以被修改,例如我们可以调用list21.set(index,element)
,但是不能对列表进行结构性修改,即不能添加或删除元素到列表中。你也可以参考我的这个回答来获取更多解释。
如果我们想要一个不可变的列表,那么我们可以将其封装为:
List<Integer> list22 = Collections.unmodifiableList(Arrays.asList(integers))
需要注意的另一点是,方法Collections.unmodifiableList
返回指定列表的不可修改视图。不可修改视图集合是一个不可修改的集合,也是对支持集合的视图。请注意,对支持集合的更改仍然可能,并且如果发生更改,则可以通过不可修改视图看到。
在Java 9和10中,我们可以拥有真正的不可变列表。
真正的不可变列表
Java 9:
String[] objects = {"Apple", "Ball", "Cat"}
List<String> objectList = List.of(objects)
Java 10(真正的不可变列表):
我们可以使用Java 9引入的List.of
,也可以使用其他方法:
List.copyOf(Arrays.asList(integers))
Arrays.stream(integers).collect(Collectors.toUnmodifiableList());
Arrays.asList(new int[] { 1, 2, 3 })
;在Java 1.4.2中绝对无法编译通过,因为一个int[]
不是一个Object[]
。请注意,这里的关键问题是int[]
和Object[]
之间的转换。 - Joachim SauerArrays.asList
代码就可以正常工作了。 - Horse Voice