![](/img/trans.png)
[英]Why can index of backing table in java.util.HashMap be the same for two different provided keys?
[英]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
。
是的,只要hashcode
和equals
会产生相同的精确值,就可以。 还要注意, get
甚至不需要参数为T
它是Object
,因此any
满足哈希码和equals的类型都可以工作
不可以使用键从地图中获取价值,并不意味着键应该与放置时使用的对象相同。
唯一的问题是hashcode&equals应该相同,这就是如果您想使用自己的类对象作为键的原因,它必须重写Hashcode&equals方法。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.