假设我有一个哈希图M
。 我想在这个 HashMap 上调用"get"函数,并找到与给定对象S
关联的值。 但是我没有对对象S
的实际引用,所以我创建了一个新对象S_new
其内容与S
的内容相同。 如果我调用M.get(S_new)
,这会给我与键S
关联的值吗?
来自 Map#get 的文档:
public V get(Object key)
返回指定键映射到的值,如果返回 null,则返回 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
满足哈希码和等于的类型都可以工作
否 使用键从地图中获取值并不意味着键应该是在放置时使用的同一对象。
唯一的问题是哈希码和等于应该是相同的,这就是为什么如果你想使用自己的类对象作为键,它必须覆盖哈希码和等于方法。