This question already has answers here:
Immutable vs Unmodifiable collection
(10个答案)
6年前关闭。
上下文
我需要返回对我用于数据缓存的 map 的引用,并且我想确保没有人可以修改其引用。
问题
我在网上看到过很多对UnmodifiableMap和ImmutableMap的引用,但是我看不出有什么比较/对照之处。我认为Google/Guava创建自己的版本是有充分理由的-有人可以告诉我它是什么吗?
与此相反,Guava的ImmutableMap实际上是不可变的:它是给定 map 的真实副本,没有人可以任何方式修改此ImmutableMap。
更新:
如comment中指出的,还可以使用以下标准API创建不可变的映射:
这将在给定 map 的真实副本上创建一个不可修改的 View ,从而很好地模拟了
(10个答案)
6年前关闭。
上下文
我需要返回对我用于数据缓存的 map 的引用,并且我想确保没有人可以修改其引用。
问题
我在网上看到过很多对UnmodifiableMap和ImmutableMap的引用,但是我看不出有什么比较/对照之处。我认为Google/Guava创建自己的版本是有充分理由的-有人可以告诉我它是什么吗?
最佳答案
不可修改的 map 可能仍会更改。它只是可修改 map 上的一个 View ,支持 map 中的更改将通过不可修改 map 可见。不可修改的映射仅阻止那些仅引用不可修改 View 的用户进行修改:
Map<String, String> realMap = new HashMap<String, String>();
realMap.put("A", "B");
Map<String, String> unmodifiableMap = Collections.unmodifiableMap(realMap);
// This is not possible: It would throw an
// UnsupportedOperationException
//unmodifiableMap.put("C", "D");
// This is still possible:
realMap.put("E", "F");
// The change in the "realMap" is now also visible
// in the "unmodifiableMap". So the unmodifiableMap
// has changed after it has been created.
unmodifiableMap.get("E"); // Will return "F".
与此相反,Guava的ImmutableMap实际上是不可变的:它是给定 map 的真实副本,没有人可以任何方式修改此ImmutableMap。
更新:
如comment中指出的,还可以使用以下标准API创建不可变的映射:
Map<String, String> immutableMap =
Collections.unmodifiableMap(new LinkedHashMap<String, String>(realMap));
这将在给定 map 的真实副本上创建一个不可修改的 View ,从而很好地模拟了
ImmutableMap
的特性,而不必向Guava添加依赖项。关于java - UnmodifiableMap(Java集合)与ImmutableMap(Google),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22636575/
10-12 01:26