List<String> hi = Collections.nCopies(10, "Hi");
List<String> are = Collections.nCopies(10, "Are");
hi.addAll(are);
hi.forEach(System.out::println);
Run Code Online (Sandbox Code Playgroud)
产量
Exception in thread "main" java.lang.UnsupportedOperationException
at java.util.AbstractList.add(Unknown Source)
at java.util.AbstractList.add(Unknown Source)
at java.util.AbstractCollection.addAll(Unknown Source)
at com.practice.java8.lambdaexp.Test.main(Test.java:14)
Run Code Online (Sandbox Code Playgroud)
我认为AbstractList.add()在JDK中没有实现.这就是为什么它不起作用.
但是,如果我使用CopiesList对象创建一个新的ArrayList对象,它可以工作,因为它将具有正确的add()实现.
我的问题是:为什么CopiesListaddAll 没有 正确的实现?
正如JavaDoc所说,返回的列表是不可变的,这意味着您无法修改它:
[nCopies] 返回一个由指定对象的 n 个副本组成的不可变列表。
也许您没有得到“与 List.addAll 结合”部分。您必须有一个非不可变列表,您可以在其中添加所有元素:
List modifiableList = new ArrayList<String>();
List<String> hi = Collections.nCopies(10, "Hi");
List<String> are = Collections.nCopies(10, "Are");
modifiableList.addAll(are);
modifiableList.addAll(hi);
modifiableList.forEach(System.out::println);
Run Code Online (Sandbox Code Playgroud)
Collections.nCopies返回一个不可变的List,所以你不能添加任何东西:
返回由指定对象的n个副本组成的不可变列表.
它返回一个不可变的,List因为它只包含您传递给其构造函数的元素的单个引用:
新分配的数据对象很小(它包含对数据对象的单个引用).
这样做是为了提高性能和存储要求 - Collections.nCopies(10, "Hi")并Collections.nCopies(10000000, "Hi")占用相同的空间.
因此,将其实现为可变列表将非常困难.例如,10000如果没有为该元素分配存储空间,您会如何设置'th元素为某个新值?
如果需要包含同一对象副本的可变List,则必须将不可变List传递给某个可变List构造函数:
List<String> mutable = new ArrayList<>(Collections.nCopies(10, "Hi"));
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
362 次 |
| 最近记录: |