从数组创建可变列表?

时间:2012-07-25 21:49:38

标签: java arrays list mutable

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

Stack Overflow有很多问题/答案可以解决Arrays.asList()以及它如何只提供底层数组的List视图,以及如何尝试操作生成的List通常会抛出UnsupportedOperationException作为方法用于操纵列表(例如add()remove()等)不是由Arrays.asList()提供的列表实现实现的。

但我找不到如何将数组转换为可变List的示例。我想我可以循环遍历数组并将put()每个值放入一个新的List中,但我想知道是否存在为我这样做的接口。

6 个答案:

答案 0 :(得分:93)

一个简单的方法:

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

这将创建一个可变列表 - 但它将是原始数组的副本。更改列表将更改阵列。您可以稍后使用toArray将其复制回来。

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

答案 1 :(得分:13)

如果您使用的是Google集合API

Lists.newArrayList(myArray)

答案 2 :(得分:5)

这个使用Java 8中包含的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));

答案 3 :(得分:4)

如果您使用的是Eclipse Collections(以前为GS Collections),则可以使用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);

两种方法的区别在于数组是否被复制。 newListWith()不会复制数组,因此需要一段时间。如果您知道阵列可能在其他地方发生变异,则应该避免使用它。

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);

注意:我是Eclipse Collections的提交者。

答案 4 :(得分:0)

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

答案 5 :(得分:0)

使用Streams API添加另一个选项:

List<Foo> list = Arrays.stream(array).collect(Collectors.toList());