似乎来晚了,但这是我的两分钱。我们不能List<int>
因为int
是基本类型,所以我们只能有List<Integer>
。
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
例如的特定实现,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> list 22 = 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.copyOf(Arrays.asList(integers))
Arrays.stream(integers).collect(Collectors.toUnmodifiableList());
还要检查我的答案以获取更多信息。
Arrays.asList(new int[] { 1, 2, 3 })
; 绝对没有用Java 1.4.2编译,因为int[]
是不是一个Object[]
。