Google的ImmutableList和Collections.unmodifiableList()有什么区别?

2022-08-31 16:59:16

来自 ImmutableList javadocs:

与 Collections.unmodifiableList(java.util.List)不同,Collections.unmodifiableList(java.util.List)是仍然可以更改的单独集合的视图,ImmutableList 的实例包含自己的私有数据,永远不会更改。ImmutableList对于公共静态最终列表(“常量列表”)很方便,并且还允许您轻松地制作调用方提供给类的列表的“防御性副本”。

这是否意味着:

  1. 如果我有不可变的维度对象列表(例如),那么我无法更改其中的任何维度对象?
  2. 如果我有Vimensions.unmodifiableList(列表)的维度对象,那么我不仅可以添加或删除任何对象,但我可以更改它们(例如调用setDimension(宽度,高度)方法)?

答案 1

否,不可变性仅应用于 中对象的数量和引用,而不解决放入 中的对象的可变性。CollectionCollection

与标准 JDK 相比,不可变列表的优点是,通过使用,可以保证引用的对象、其顺序和列表的大小不能从任何源更改。如果其他内容具有对基础列表的引用,则该代码可以修改该列表,即使您具有对不可修改列表的引用也是如此。Collections.unmodifiableListImmutableListCollections.unmodifiableList

但是,如果您想要真正的不可变性,则必须使用不可变对象填充列表。


答案 2

使用 会创建一个围绕列表的包装器。如果基础列表发生变化,则不可修改列表的视图也会发生变化。Collections.unmodifiableList

正如文档所说,谷歌的代码会创建一个副本。这是一个更昂贵的计算,消耗更多的内存,但如果有人改变原始列表,它不会影响不可变列表。

这些都不会阻止您更改列表中的对象,或其字段或字段等。


推荐