比较hashmap键,为什么要比较键的hashcode和key的值

Dan*_*iel 5 java hashmap hashcode

下面是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;
}
Run Code Online (Sandbox Code Playgroud)

Mur*_*nik 8

与调用复杂对象相比,测试int相等性==是一种相当便宜的操作equals.哈希的平等是一种捷径.如果密钥根本不存在,则散列将不相等,并且相对快速的==返回false将节省运行昂贵的equals操作(由于短路逻辑).如果关键在那里,你只是"浪费"另一个快速平等.