首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >当通过Map.put(K,V)添加值时,必须通过Map.get(K)返回相同的实例吗?

当通过Map.put(K,V)添加值时,必须通过Map.get(K)返回相同的实例吗?
EN

Stack Overflow用户
提问于 2011-02-17 04:33:35
回答 7查看 562关注 0票数 5

假设您有以下代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Map<Foo, Bar> map = new HashMap<Foo, Bar>();

Foo foo = new Foo();
Bar bar = new Bar();
map.put(foo, bar);

Bar barReturned = map.get(foo);

Java需要那个barReturned == bar吗?也就是说,Java是否要求barReturnedbar是同一个实例?如果没有,那么需要什么样的语义?

Javadoc建议barReturned == bar必须是真的,但我不能百分之百肯定:

V get(Object key) 返回指定键映射到的值,如果此映射不包含键的映射,则返回null。 更正式地说,如果此映射包含从键k到值v的映射(如(key==null ? k==null : key.equals(k)) ),则此方法返回v;否则将返回null。(最多只能有一个这样的映射。) 如果此映射允许null值,则返回值null并不一定表示映射不包含对键的映射;映射也可能显式地将键映射到null。containsKey手术可以用来区分这两种情况。 参数: key -该键的关联值将被返回 返回: 指定键映射到的值,如果此映射不包含键的映射,则为null

(强调地雷)

编辑:--我理解与标准库捆绑在一起的Map实现遵循barReturned == bar语义。我想知道的是,根据文档,这种行为是否是必需的。例如,如果我编写实现Map的类,那么必须遵守这些语义吗?

EN

回答 7

Stack Overflow用户

发布于 2011-02-17 04:54:26

如果你问你是否能打破这种关系,我认为答案是“是”。例如,如果您正在实现一个像持久缓存一样的Map,那么如果没有在一段时间内使用,那么可能会将一个特定的值写入磁盘,然后稍后重新加载。在这种情况下,你不会有引用相等,但没关系。显然,您需要记录任何偏离标准行为的情况,但我不认为这超出了Map的合理使用范围。

票数 4
EN

Stack Overflow用户

发布于 2011-02-17 04:46:03

当然,它将是--同一个实例。否则Map就没用了。

不过,这方面的唯一例外是多线程应用程序,在调用putget之间,其他线程可以将任意值放入相同的键。

正如亚当在评论中指出的那样,编辑有一个特殊的情况,他的地图实现可以重新创建传入的对象并使用它们的副本。从这个意义上说,original.equals(copy)是真,original == copy是假。在这种情况下,我认为Map可以存储副本而不是原件。

票数 1
EN

Stack Overflow用户

发布于 2011-02-17 04:50:37

如果您将javadocs中使用的术语解释为映射中对象的引用,这将意味着您始终需要返回与您在映射中放置的引用相同的引用,并且您将具有==相等。然后,更多的问题是文档中使用的值一词的定义。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5028962

复制
相关文章
为什么 HashMap 要用 h^(h >>>16) 计算hash值?槽位数必须是 2^n?
昨天中午,一位粉丝朋友在微信私信我,问:为啥HashMap的hash值计算格式是这样:(h = key.hashCode()) ^ (h >>> 16)?h ^ ^ (h >>> 16)是什么意思?
一行Java
2022/05/17
1.1K0
为什么 HashMap 要用 h^(h >>>16) 计算hash值?槽位数必须是 2^n?
通过Kuberhealthy了解K8s的KPI
作者:Joshulyne Park(Comcast),Eric Greer(Comcast)
CNCF
2020/06/04
1.4K0
k8s 通过helm发布应用
在红帽系的Linux中我们使用yum来管理RPM包,类似的,在K8s中我们可以使用helm来管理资源对象(Deployment、Service、Ingress...)实现K8s中应用的快速发布、升级、维护和分享。helm 官方文档[1]
你大哥
2022/03/14
6350
k8s 通过helm发布应用
Map接口和其子类HashMap遍历、LinkedHashMap
现实生活中,我们常会看到这样的一种集合:IP地址与主机名,身份证号与个人,系统用户名与系统用户对象等,这种一一对应的关系,就叫做映射。Java提供了专门的集合类用来存放这种对象关系的对象,即java.util.Map接口。 我们通过查看Map接口描述,发现Map接口下的集合与Collection接口下的集合,它们存储数据的形式不同,如下图。
共饮一杯无
2022/11/28
2580
Map接口和其子类HashMap遍历、LinkedHashMap
面试官:为什么重写 equals 同时要重写 hashCode? 我:…
重写equals是为了在业务逻辑上判断实例之间是否相等。重写hascode是为了让集合快速判重。
终码一生
2022/04/14
2840
Java(集合④)
当方法的参数列表数据类型已经确定,但是参数个数不确定,就可以使用可变参数;
全栈开发日记
2022/05/12
7250
(66) 理解synchronized / 计算机程序的思维逻辑
上节我们提到了多线程共享内存的两个问题,一个是竞态条件,另一个是内存可见性,我们提到,解决这两个问题的一个方案是使用synchronized关键字,本节就来讨论这个关键字。 用法 synchronized可以用于修饰类的实例方法、静态方法和代码块,我们分别来看下。 实例方法 上节我们介绍了一个计数的例子,当多个线程并发执行counter++的时候,由于该语句不是原子操作,出现了意料之外的结果,这个问题可以用synchronized解决。 我们来看代码: public class Counter {
swiftma
2018/01/31
7470
(66) 理解synchronized / 计算机程序的思维逻辑
JDK1.9-Map集合
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
cwl_java
2019/12/03
3720
《Java 数据结构与算法》第5章:哈希表(散列)
哈希散列的想法在不同的地方独立出现。1953 年 1 月,汉斯·彼得·卢恩 ( Hans Peter Luhn ) 编写了一份IBM内部备忘录,其中使用了散列和链接。开放寻址后来由 AD Linh 在 Luhn 的论文上提出。大约在同一时间,IBM Research的Gene Amdahl、Elaine M. McGraw、Nathaniel Rochester和Arthur Samuel为IBM 701汇编器实现了散列。 线性探测的开放寻址归功于 Amdahl,尽管Ershov独立地有相同的想法。“开放寻址”一词是由W. Wesley Peterson在他的文章中创造的,该文章讨论了大文件中的搜索问题。
小傅哥
2022/12/13
7040
《Java 数据结构与算法》第5章:哈希表(散列)
Java类集框架详细汇总
Java的类集框架比较多,也十分重要,在这里给出图解,可以理解为相应的继承关系,也可以当作重要知识点回顾;
BUG弄潮儿
2021/04/12
7160
【Java】Map集合
现实生活中,我们常会看到这样的一种集合:IP地址与主机名,身份证号与个人,系统用户名与系统用户对象等,这种一一对应的关系,就叫做映射。Java提供了专门的集合类用来存放这种对象关系的对象,即java.util.Map接口。
陶然同学
2023/02/27
1.2K0
【Java】Map集合
如何通过Openshift实现K8S容灾?
越来越多的K8S应用采用RedHat OpenShift进行部署,IT团队需要部署容灾功能,来防范系统崩溃导致业务受损。一部分行业通常有较强的监管要求,在出现大规模错误的时候必须有数据保护。例如HIPAA 监管要求中的CFR 164.308(7)(ii)(B),要求公司必须能够在出现系统错误的时候“恢复所有数据”。这种情况下对于Openshift上的关键应用来说,容灾是必须的。
Portworx
2020/05/30
1.5K0
踩坑:在Java中使用 byte 数组作为 Map 的 key
本文将引领我们探索:如何将byte数组作为HashMap中键。HashMap的机制使我们无法直接这样做。让我们研究一下,为何出现此状况,以及针对这种情况,几种可供选择的解决方案。
万猫学社
2023/09/01
5290
踩坑:在Java中使用 byte 数组作为 Map 的 key
Mac virtualbox k8s通过yaml创建pod_解决k8s无法通过svc访问其他节点pod的问题
当透过其他pod访问该svc时(使用命令k exec kubia-nwjcc -- curl http://10.98.41.49),出现了只能访问到和自己同处于一个节点的pod的问题,访问到其他节点上的pod时会出现command terminated with exit code 7的问题,如下:
用户1212940
2021/12/06
1.2K0
java笔记–Map的用法
我们通过查看Map接口描述,发现Map接口下的集合与Collection接口下的集合,它们存储数据的形式不同,如下图。
全栈程序员站长
2022/09/17
7870
java笔记–Map的用法
数据结构思维 第十章 哈希
在本章中,我定义了一个比MyLinearMap更好的Map接口实现,MyBetterMap,并引入哈希,这使得MyBetterMap效率更高。
ApacheCN_飞龙
2022/12/01
7000
通过k-means进行图像量化压缩--python实现
图像读取完我们获取到的其实是一个width*height的三维矩阵(width,height是图片的分辨率)
Awesome_Tang
2018/09/11
1.5K0
通过k-means进行图像量化压缩--python实现
Java框架类集结构-底层分析
Java的类集框架比较多,也十分重要,在这里给出图解,可以理解为相应的继承关系,也可以当作重要知识点回顾;
xbhog
2021/11/15
4590
Java集合框架详述之Map集合
前言 Map接口的层次结构图: Map集合概述 Map与Collection无继承关系。 Map集合以Key和Value的方式存储数据。(键值对) Key和Value是引用数据类型。 Key和Value存储对象的内存地址。 所有Map集合的key特点:无序不可重复的。 Map集合的key和Set集合存储元素特点相同。 Map接口常用的方法: void clear() 清空集合中的元素 boolean containsKey(Object key) 判断Map中是否包含某个Key bo
百思不得小赵
2022/12/01
3000
Java集合框架详述之Map集合
JAVA–Map集合详解
特点:该集合存储键(key)值(value)对,一对一对往里存,而且要保证键(key)的唯一性。
全栈程序员站长
2022/09/01
6690

相似问题

当MyNestedClass<K>不是MyNestedClass<K>时返回MyNestedClass<K>?

23

Map.put(K,K),地图不是只有两个值吗?

15

将[(K,[V])]转到[(V,[K])]时的记忆障碍

23

std::map<K,V>::iterator是否实例化std::map<K,V>?

24

python语句:(k,v) for k,v

111
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文