This question already has answers here:
Immutable vs Unmodifiable collection

(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