【发布时间】:2018-06-27 00:37:31
【问题描述】:
假设String A = "c",Character B = 'c'。
我知道A.hashCode() == B.hashCode() 但A.equals(B) == false。
但是,如果您将 A 放入 HashMap 作为密钥。然后调用 hashMap.contains(B) 返回 false,尽管它们具有相同的 hashCode。下面是Java如何实现HashMap中的一些功能。
public boolean containsKey(Object key) {
return getNode(hash(key), key) != null;
}
static final int hash(Object key) {
int h;
return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);
}
如您所见,HashMap 仅对密钥的hashCode() 进行操作。那为什么contains() 可以返回false?
【问题讨论】:
-
你确定
A.equals(B)是真的吗? -
为什么你认为它是“只对密钥的 hashCode 进行操作”?
key也被传递给getNode,而不仅仅是它的哈希码。 -
String中重载的equals方法将给定的参数转换为String,因此不能将字符B直接传递给equals方法。
标签: java hashmap hashtable hashcode