从数组创建可变列表?

eri*_*oco 64 java arrays list mutable

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

堆栈溢出有大量的问题/,解决答案Arrays.asList()以及它如何仅提供底层阵列的列表视图,以及如何试图操纵所得列表通常将引发UnsupportedOperationException如用来操纵列表方法(例如add(),remove()等)是没有由List提供的实现实现Arrays.asList().

但我找不到如何将数组转换为可变List的示例.我想我可以循环遍历数组并将put()每个值循环到一个新的List中,但我想知道是否存在为我执行此操作的接口.

Jon*_*eet 100

一个简单的方法:

Foo[] array = ...;
List<Foo> list = new ArrayList<Foo>(Arrays.asList(array));
Run Code Online (Sandbox Code Playgroud)

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

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

  • Java需要在所有这些静态工厂方法中明确可变性/不变性.如果发现你在运行时制造了一个不可变的东西,那真是太糟糕了. (3认同)
  • Arrays.asList将视图返回到数组,支持那些不影响列表大小的变异方法 (2认同)
  • @dustinevan:IMO 文档非常清楚:“返回由指定数组支持的固定大小列表。(对返回列表的更改“写入”数组。)” (2认同)

vsi*_*ngh 15

如果您使用谷歌收集API

Lists.newArrayList(myArray)
Run Code Online (Sandbox Code Playgroud)

  • 2020 年仍然没有弃用。跳进去吧! (4认同)
  • 这是最简洁的答案。谢谢。 (2认同)
  • 甚至Guava本身也建议使用`new ArrayList &lt;&gt;(Arrays.asList(...))`-该方法的Javadoc暗示它将因为不足够有用而被弃用。 (2认同)

Mik*_*elF 7

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

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

或者,同样有效:

List<Foo> list = Arrays.stream(array).collect(Collectors.toCollection(ArrayList::new));
Run Code Online (Sandbox Code Playgroud)


Cra*_*lin 6

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

这两种方法都采用可变参数,因此您可以内联创建数组或传入现有数组。

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

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

两种方法之间的区别在于是否复制数组。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);
Run Code Online (Sandbox Code Playgroud)

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