我们不能拥有List<int>
原始int
类型,所以我们只能拥有List<Integer>
.
爪哇 16
Java 16 在 Stream API 上引入了一种新方法,称为toList()
. 这个方便的方法返回一个包含流元素的不可修改的列表。因此,尝试向列表中添加新元素只会导致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); // returns a fixed-size list backed by the specified array.
List<Integer> list22 = new ArrayList<>(Arrays.asList(integers)); // good
List<Integer> list23 = Arrays.stream(integers).collect(Collectors.toList()); //Java 8 only
需要 ArrayList 而不是 List?
List
如果我们想要eg的特定实现,ArrayList
那么我们可以使用toCollection
:
ArrayList<Integer> list24 = Arrays.stream(integers)
.collect(Collectors.toCollection(ArrayList::new));
为什么list21
不能进行结构修改?
我们使用Arrays.asList
的时候返回的列表的大小是固定的,因为返回的列表不是java.util.ArrayList
,而是一个私有的静态类里面定义的java.util.Arrays
。因此,如果我们从返回的列表中添加或删除元素,UnsupportedOperationException
则会抛出 an 。所以list22
当我们想要修改列表时,我们应该去。如果我们有 Java8,那么我们也可以使用list23
.
明确list21
地说,可以在我们可以调用的意义上进行修改,list21.set(index,element)
但该列表可能不会在结构上进行修改,即不能从列表中添加或删除元素。您也可以查看我的这个答案以获得更多解释。
如果我们想要一个不可变的列表,那么我们可以将其包装为:
List<Integer> list22 = Collections.unmodifiableList(Arrays.asList(integers));
还有一点需要注意的是,该方法Collections.unmodifiableList
返回指定列表的不可修改视图。不可修改的视图集合是不可修改的集合,也是支持集合的视图。请注意,对支持集合的更改可能仍然是可能的,并且如果发生更改,它们将通过不可修改的视图可见。
我们可以在 Java 9 和 10 中拥有一个真正不可变的列表。
真正不可变的列表
爪哇 9:
String[] objects = {"Apple", "Ball", "Cat"};
List<String> objectList = List.of(objects);
Java 10(真正的不可变列表):
我们可以使用List.of
Java 9 中引入的方法。还有其他方法:
List.copyOf(Arrays.asList(integers))
Arrays.stream(integers).collect(Collectors.toUnmodifiableList());