比较hashmap键,为什么要比较键的哈希码和键的值

时间:2016-10-14 15:53:24

标签: 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;
}

1 个答案:

答案 0 :(得分:8)

与在复杂对象上调用int相比,使用==测试equals相等是一个相当便宜的操作。哈希的平等是一种捷径。如果密钥根本不存在,则哈希值将不相等,并且返回==的相对快速的false将节省运行成本高equals的操作(由于电路逻辑)。如果关键在那里,你只是“浪费”了另一种快速平等。