private List list;
如果我们使用Collections.unmodifiableCollection(list)
,这会返回集合的副本,还是比创建副本更快?我们可以other.addAll(list)
但我们有600,000个对象的列表,所以addAll
不太好。
来电者只需要一个只读集合。
答案 0 :(得分:11)
Collections.unmodifiableList
只返回一个不可修改的包装器;它不会复制输入列表的内容。
其Javadoc相当清楚地说明了这一点:
返回指定列表的不可修改视图。此方法允许模块为用户提供对内部列表的“只读”访问。对返回列表的查询操作“通读”到指定列表,并尝试修改返回的列表,无论是直接还是通过其迭代器,都会产生
UnsupportedOperationException
。
正如Matt Ball所提到的,如果您不需要内部List
可变,您可能只想在内部存储Guava ImmutableList ...您可以放心地给出直接给呼叫者,因为它永远不会改变。
答案 1 :(得分:8)
Collections.unmodifiableCollection(list)
是否会复制该集合?
其他答案都是正确的(+1
四处都是):答案是否。
您可以使用Guava's ImmutableList.copyOf()
来创建不可变(不可修改)的列表副本,而不是Collections.unmodifiableList()
。
答案 2 :(得分:7)
Collections.unmodifiableCollection(..)
只包装原始集合,禁用修改方法。它没有复制它。
如果更改原始列表,“不可修改”集合也将更改。但是只有不可修改的集合的客户端无法改变它。