java - hashmap 键的比较,为什么要同时比较键的哈希码和键的值

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

最佳答案

与在复杂对象上调用equals 相比,使用== 测试int 是否相等是一个相当便宜的操作。哈希的相等性是一种捷径。如果 key 根本不存在,哈希将不相等,并且返回 false 的相对快速的 == 将节省运行昂贵的 equals 操作(感谢短路逻辑)。如果 key 在那里,你就“浪费”了另一个快速相等。

关于java - hashmap 键的比较,为什么要同时比较键的哈希码和键的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40047355/

相关文章:

java - Bean 验证和 JAX-WS

java - 从 Map 创建列表,其中包含 Map 值的前 N ​​个对象

java - 如何找到 HashMap 中的最低值?

c# - 在哈希表中插入两次相同的键,这怎么可能?

java - console 和 eclipse maven 有什么区别

java.lang.NumberFormatException : For input string ComboBox

java - 我应该在 JPA 实体中编写 equals() 和 hashCode() 方法吗?

java - 编译器或 JVM 是否强制执行 hashCode/equals 约定?

Java:在 SQL 数据库中对事件执行某些操作?

java - 尝试将 hashmap getValue() 解析为 int 时出错