Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/397.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Collections.unmodifiableCollection(列表)是否复制集合?_Java_Collections - Fatal编程技术网

Java Collections.unmodifiableCollection(列表)是否复制集合?

Java Collections.unmodifiableCollection(列表)是否复制集合?,java,collections,Java,Collections,如果我们使用Collections.unmodifiableCollection(list),这将返回集合的副本,还是比创建副本更快?我们可以做other.addAll(list)但是我们有600000个对象的列表,所以addAll不是很好 调用方只需要一个只读集合。集合。unmodifiableList只返回一个不可修改的包装;它不会复制输入列表的内容 它相当清楚地指出: 返回指定列表的不可修改视图。此方法允许模块向用户提供对内部列表的“只读”访问。对返回列表的查询操作“通读”到指定列表,并尝

如果我们使用
Collections.unmodifiableCollection(list)
,这将返回集合的副本,还是比创建副本更快?我们可以做
other.addAll(list)
但是我们有600000个对象的列表,所以
addAll
不是很好


调用方只需要一个只读集合。

集合。unmodifiableList
只返回一个不可修改的包装;它不会复制输入列表的内容

它相当清楚地指出:

返回指定列表的不可修改视图。此方法允许模块向用户提供对内部列表的“只读”访问。对返回列表的查询操作“通读”到指定列表,并尝试修改返回列表(无论是直接修改还是通过其迭代器修改),会导致
不支持操作异常


正如Matt Ball提到的,如果您不需要内部
列表
是可变的,那么您可能只需要在内部存储一个。。。您可以安全地直接将其提供给调用方,因为它永远不会更改。

集合。不可修改的集合(..)
只需包装原始集合,禁用修改方法。它不会复制它

如果更改原始列表,“不可修改”集合也将更改。但是只有不可修改集合的客户端无法更改它

集合。不可修改集合(列表)
是否复制集合

其他答案都是正确的(
+1
s):答案是否。



您可以使用来创建不可变(不可修改)的列表副本。

番石榴方法的优点是什么?布伦丹:仔细阅读答案的最后一句。如果你仍然看不到它,那就读一下JavaDoc吧。我只是不知道“不可变”和“不可修改”之间的区别是什么?我可以阅读Javadoc,但如果你的答案能解释其中的区别,那就更有帮助了。@Brendan:不可变和不可修改的区别在于不可变保证“这永远不会改变”,而不可修改只是说“你不能改变这一点,但其他东西可能可以改变”。如果在第一次创建列表后不需要修改列表内容,则最好使用番石榴方法。。。您可以自由地共享它。@BrendanLong Guava方法的另一大优点是,在尝试修改一个不可变(不能更改)字段时,您(我打赌)会得到一个编译时异常,而不是运行时异常。在编译时而不是运行时发现错误是一个很大的好处。嗯,你说javadoc相当清楚地说明了这一点,但我看不清楚。你是说因为他们说的是风景?这一点很重要,所以文档不清楚。我认为应该说使用包装器,而不是像第一个答案所说的复制集合。@Gorca:是的,“视图”意味着“不是副本”。如果它这样做了,它很可能会说它创建了一个副本。它还解释了它将查询方法转发到给定的列表。这清楚地回答了问题。谢谢
private List list;