假设我有一个HashMap M
。我想在此HashMap上调用“get”函数,并找到与给定对象S
关联的值。但我没有对象S
的实际引用,因此我创建了一个新对象S_new
,其内容与S
的内容相同。如果我拨打M.get(S_new)
,是否会为我提供与密钥S
相关联的值?
答案 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)
是的,只要hashcode
和equals
生成相同的确切值即可。另请注意,get
甚至不要求参数为T
- 它是Object
,因此any
类型可以满足哈希码,而等号可以使用
答案 2 :(得分:0)
不使用键从地图获取值并不表示该键应该是放置时使用的相同对象。
唯一的问题是hashcode&amp; equals应该是相同的,这就是它必须覆盖Hashcode&amp;如果你想使用自己的类对象作为键,则使用equals方法。