繁体   English   中英

java.util.HashMap get:密钥是否必须与存储在HashMap中的对象完全相同,或者密钥可以只是“相等”

[英]java.util.HashMap get: does key have to be exactly the same object as what is stored in the HashMap, or can the keys just be “equal”

假设我有一个HashMap M 我想在此HashMap上调用“ get”函数,并找到与给定对象S关联的值。 但是我没有对对象S的实际引用,因此我创建了一个新对象S_new其内容与S的内容相同。 如果我调用M.get(S_new) ,那会给我与键S关联的值吗?

Map#get的文档中

public V get(Object key)

返回指定键所映射到的值;如果此映射不包含键的映射关系,则返回null。 更正式地讲,如果此映射包含从键k到值v的映射,使得(key==null ? k==null : key.equals(k)) ,则此方法返回v 否则返回null (最多可以有一个这样的映射。)

因此,只要您传递的参数以使映射键被视为等效的方式覆盖equals ,就可以使用其他实例从映射中检索值。

另外,正如@Eugene和其他人提到的那样,对于HashMap您还必须重写hashCode方法,并确保您的实例返回与键相同的值。 通常,最佳实践是确保相等实现是对称的 (即A.equals(B) <==> B.equals(A) ),并且相等的值应具有相同的hashCode

是的,只要hashcodeequals会产生相同的精确值,就可以。 还要注意, get甚至不需要参数为T它是Object ,因此any满足哈希码和equals的类型都可以工作

不可以使用键从地图中获取价值,并不意味着键应该与放置时使用的对象相同。

唯一的问题是hashcode&equals应该相同,这就是如果您想使用自己的类对象作为键的原因,它必须重写Hashcode&equals方法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM