hashmap 键的比较,为什么要同时比较键的哈希码和键的值
comparison of hashmap key, why compare both key's hashcode and key's value
下面是Java 7 的HashMap
实现(get()
方法)的源代码。正如你所看到的,在get方法中,当比较键时,它会比较键的哈希码和键的值,以确定链表中的条目是否是要搜索的键。但是,我想如果两个键相同,它们当然会有相同的哈希码,如果两个键不同,比较键的值就足以区分它们。那么为什么 Java HashMap
源代码关心键的哈希码是否相等?
public V get(Object key) {
if (key == null)
return getForNullKey();
int hash = hash(key.hashCode());
for (Entry<K,V> e = table[indexFor(hash, table.length)];
e != null;
e = e.next) {
Object k;
if (e.hash == hash && ((k = e.key) == key || key.equals(k)))
return e.value;
}
return null;
}
与在复杂对象上调用 equals
相比,用 ==
测试 int
是否相等是一个相当便宜的操作。哈希的相等性是一种捷径。如果根本不存在密钥,则哈希值将不相等,相对较快的 ==
returns false
将节省 运行 昂贵的 equals
操作(由于短路逻辑)。如果钥匙在那里,你就 "wasted" 另一个快速相等。
下面是Java 7 的HashMap
实现(get()
方法)的源代码。正如你所看到的,在get方法中,当比较键时,它会比较键的哈希码和键的值,以确定链表中的条目是否是要搜索的键。但是,我想如果两个键相同,它们当然会有相同的哈希码,如果两个键不同,比较键的值就足以区分它们。那么为什么 Java HashMap
源代码关心键的哈希码是否相等?
public V get(Object key) {
if (key == null)
return getForNullKey();
int hash = hash(key.hashCode());
for (Entry<K,V> e = table[indexFor(hash, table.length)];
e != null;
e = e.next) {
Object k;
if (e.hash == hash && ((k = e.key) == key || key.equals(k)))
return e.value;
}
return null;
}
与在复杂对象上调用 equals
相比,用 ==
测试 int
是否相等是一个相当便宜的操作。哈希的相等性是一种捷径。如果根本不存在密钥,则哈希值将不相等,相对较快的 ==
returns false
将节省 运行 昂贵的 equals
操作(由于短路逻辑)。如果钥匙在那里,你就 "wasted" 另一个快速相等。