从数组创build可变列表?

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

堆栈溢出有很多问题/答案,解决Arrays.asList() ,以及它如何只提供一个列表视图的底层数组,以及如何试图操纵结果列表通常会抛出一个UnsupportedOperationException作为方法来操纵列表(例如add()remove()等)不是由Arrays.asList()提供的List实现实现的。

但是我找不到如何将数组变成可变列表的例子。 我想我可以遍历数组put()每个值放入一个新的列表,但我想知道是否有一个接口存在为我做这个。

一个简单的方法:

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

这将创build一个可变列表 – 但它将是原始数组的副本 。 更改列表不会改变数组。 您可以稍后复制它,当然,使用toArray

如果你想创build一个可变的视图到一个数组,我相信你将不得不自己实现。

如果你使用谷歌收集API的

 Lists.newArrayList(myArray) 

如果您使用Eclipse集合 (以前称为GS集合 ),则可以使用FastList.newListWith(...)FastList.wrapCopy(...)

两种方法都使用可变参数,因此您可以在内部创build数组或传入现有数组。

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

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

 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集合的提交者。

 myNewArrayList = new ArrayList( Arrays.asList( (Object[])myArray))); 

使用Java 8中包含的Stream API的简单代码将创build一个包含数组元素的可变列表(或视图):

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

或者同样有效:

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