List<String> hi = Collections.nCopies(10, "Hi");
List<String> are = Collections.nCopies(10, "Are");
hi.addAll(are);
hi.forEach(System.out::println);
输出量
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)
我认为AbstractList.add()在JDK中没有实现。这就是为什么它不起作用。
但是,如果我使用CopiesList对象创建一个新的ArrayList对象,它将起作用,因为它将具有适当的add()实现。
我的问题是:为什么
CopiesList
没有正确的addAll实现? 最佳答案
Collections.nCopies
返回一个不变的List
,因此您不能向其中添加任何内容:
返回由n个指定对象副本组成的不变列表。
它返回一个不变的List
,因为它仅包含您传递给其构造函数的元素的单个引用:
新分配的数据对象很小(,它包含对数据对象的单个引用)。
这样做是为了提高性能和存储要求-Collections.nCopies(10, "Hi")
和Collections.nCopies(10000000, "Hi")
占据相同的空间量。
因此,将其实现为可变列表将非常困难。如果没有为该元素分配存储,如何将第10000
个元素设置为某个新值?
如果需要包含相同对象副本的可变列表,则必须将不可变列表传递给某些可变列表构造函数:
List<String> mutable = new ArrayList<>(Collections.nCopies(10, "Hi"));