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

时间:2017-08-08 20:36:32

标签: java hashmap

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

3 个答案:

答案 0 :(得分:4)

来自the documentation for 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)&lt; ==&gt; B.equals(A)),并且相等的值应该具有相同的值hashCode

答案 1 :(得分:3)

是的,只要hashcodeequals生成相同的确切值即可。另请注意,get甚至不要求参数为T - 它是Object,因此any类型可以满足哈希码,而等号可以使用

答案 2 :(得分:0)

不使用键从地图获取值并不表示该键应该是放置时使用的相同对象。

唯一的问题是hashcode&amp; equals应该是相同的,这就是它必须覆盖Hashcode&amp;如果你想使用自己的类对象作为键,则使用equals方法。