有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java比较hashmap键,为什么同时比较键的hashcode和键的值

下面是Java7的HashMap实现(get()方法)的源代码。如您所见,在get方法中,在比较键时,它会比较键的hashcode和键的值,以确定linkedlist中的条目是否是搜索的键。但是,我假设如果两个键相同,它们当然会有相同的哈希代码,如果两个键不同,比较键的值就足以区分它们。那么,为什么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) 个答案

  1. # 1 楼答案

    与在复杂对象上调用equals相比,用==测试int等式是一个相当便宜的操作。散列相等是一条捷径。如果密钥根本不存在,哈希值就不相等,一个相对快速的返回false==将避免运行代价高昂的equals操作(由于短路逻辑)。如果关键在那里,你只是“浪费”了另一个快速平等