从数组创建可变 List?

我有一个数组,我想变成一个 List,以修改数组的内容。

Stack Overflow 提供了大量的问题/答案,解决了 Arrays.asList()以及它如何只提供底层数组的 List 视图,以及如何尝试操作最终的 List 通常会抛出一个 UnsupportedOperationException,因为用于操作 List 的方法(例如 add()remove()等)并没有被 Arrays.asList()提供的 List 实现实现。

但我找不到如何将数组转换为可变 List 的示例。我想我可以通过数组和 put()将每个值循环到一个新的 List 中,但是我想知道是否有一个接口可以为我做到这一点。

87815 次浏览

One simple way:

Foo[] array = ...;
List<Foo> list = new ArrayList<Foo>(Arrays.asList(array));

这将创建一个可变的列表-但它将是原始数组的 收到。更改列表将 没有更改数组。当然,您可以稍后使用 toArray将其复制回来。

如果您想在数组上创建一个可变的 风景,我相信您必须自己实现它。

myNewArrayList = new ArrayList<>(Arrays.asList(myArray));

如果你正在使用谷歌收集 API 的(番石榴) :

Lists.newArrayList(myArray);

如果使用 Eclipse 集合(以前是 GS 系列) ,则可以使用 FastList.newListWith(...)FastList.wrapCopy(...)

这两个方法都采用 varargs,因此您可以内联创建数组或传递现有数组。

MutableList<Integer> list1 = FastList.newListWith(1, 2, 3, 4);


Integer[] array2 = {1, 2, 3, 4};
MutableList<Integer> list2 = FastList.newListWith(array2);

The difference between the two methods is whether or not the array gets copied. newListWith() doesn't copy the array and thus takes constant time. You should avoid using it if you know the array could be mutated elsewhere.

Integer[] array2 = {1, 2, 3, 4};
MutableList<Integer> list2 = FastList.newListWith(array2);
array2[1] = 5;
Assert.assertEquals(FastList.newListWith(1, 5, 3, 4), list2);


Integer[] array3 = {1, 2, 3, 4};
MutableList<Integer> list3 = FastList.wrapCopy(array3);
array3[1] = 5;
Assert.assertEquals(FastList.newListWith(1, 2, 3, 4), list3);

Note: I am a committer for Eclipse Collections.

这段使用 Java8中包含的 Stream API 的简单代码创建了一个包含数组元素的可变列表(或视图) :

Foo[] array = ...;
List<Foo> list = Stream.of(array).collect(Collectors.toCollection(ArrayList::new));

或者,同样有效:

List<Foo> list = Arrays.stream(array).collect(Collectors.toCollection(ArrayList::new));