当前位置: 首页 > 面试题库 >

UnmodifiableMap(Java集合)与ImmutableMap(Google)

宗政安歌
2023-03-14
问题内容

语境

我需要返回对我用于数据缓存的地图的引用,并且我想确保没有人可以修改其引用。

我在网上看到过很多对UnmodifiableMap和ImmutableMap的引用,但是我看不出有什么比较/对照之处。我认为Google /
Guava创建自己的版本是有充分理由的-有人可以告诉我它是什么吗?


问题答案:

不可修改的地图可能仍会更改。它只是可修改地图上的一个 视图
,支持地图中的更改将通过不可修改地图可见。不可修改的映射仅阻止那些仅引用不可修改的视图的人进行修改:

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实际上是 不可变的 :它是给定地图的真实 副本 ,没有人可以任何方式修改此ImmutableMap。

更新

如评论中指出的,也可以使用以下标准API创建不可变的映射:

Map<String, String> immutableMap = 
    Collections.unmodifiableMap(new LinkedHashMap<String, String>(realMap));

这将在给定地图的真实副本上创建一个不可修改的视图,从而很好地模拟的特性,ImmutableMap而不必向Guava添加依赖项。



 类似资料:
  • 本文向大家介绍Java中的集合与集合之间的区别,包括了Java中的集合与集合之间的区别的使用技巧和注意事项,需要的朋友参考一下 Java收集框架用于操纵对象的收集。收集框架包含多个包装器类,便利类,用于传统实现的类,例如vector和Hashtable,收集接口等。     集合是Java集合框架中的接口。它分为两部分- Java util集合-它包含诸如Set,queue,List等的类。 Ja

  • 我有一张班友名单 我想分组名单的foo根据他们的位置和总和,我如何实现它与Java流? 我所取得的成就: 我的代码:

  • Map和Set都叫做集合,但是他们也有所不同。Set常被用来检查对象中是否存在某个键名,Map集合常被用来获取已存的信息。 Set Set是有序列表,含有相互独立的非重复值。 创建Set 既然我们现在不知道Set长什么样,有什么价值,那么何不创建一个Set集合看看呢? 创建一个Set集合,你可以这样做: let set = new Set(); console.log(set);

  • 我正在尝试为firestore中的社交媒体应用程序组织数据。为帖子创建一个新集合或将其放入用户的子集合更好吗? 深度应该是一样的,但是一种方式比另一种方式有什么优势吗? 创建新集合: 职位(集合) 用户(集合) 用户中的子集合: 用户(集合)

  • 问题内容: 除了a 和Java 可以两次包含相同的元素外,a 和Java 之间在实践上还有什么区别吗?它们具有相同的方法。 (例如,是否给我更多选择来使用接受s但不接受s的库?) 编辑: 我可以认为至少有5种不同的情况来判断这个问题。其他人还能提出更多建议吗?我想确保我了解这里的微妙之处。 设计接受或参数的方法。更通用,并接受更多输入可能性。(如果我正在设计特定的类或接口,那么对我的消费者会更好,

  • 在编程时,可以使用数组来保存多个对象,但数组长度不可变化,一旦在初始化数组时指定了数组长度,这个数组长度就是不可变的。如果需要保存数量变化的数据,数组就有点无能为力了。而且数组无法保存具有映射关系的数据,如成绩表为语文——79,数学——80,这种数据看上去像两个数组,但这两个数组的元素之间有一定的关联关系。 为了保存数量不确定的数据,以及保存具有映射关系的数据(也被称为关联数组), Java 提供