我们不能有List<int>,因为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 array)
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
需要数组列表而不是列表?
如果我们想要List的特定实现,例如ArrayList,那么我们可以使用toCollection作为:
ArrayList<Integer> list24 = Arrays.stream(integers)
.collect(Collectors.toCollection(ArrayList::new));
为什么不能在结构上修改list21 ?
当我们使用数组时。asList返回列表的大小是固定的,因为返回的列表不是java.util。它是一个私有静态类,定义在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(真正不可变列表):
我们可以使用List。Java 9中引入的。还有其他方式:
List.copyOf(Arrays.asList(integers))
Arrays.stream(integers).collect(Collectors.toUnmodifiableList());