【问题标题】:comparison of hashmap key, why compare both key's hashcode and key's valuehashmap key 的比较,为什么要同时比较 key 的 hashcode 和 key 的 value
【发布时间】:2016-10-14 15:53:24
【问题描述】:

下面是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;
}

【问题讨论】:

    标签: java hashmap hashcode


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-06-27
      • 1970-01-01
      • 2015-06-30
      • 1970-01-01
      • 2011-05-16
      • 2013-03-21
      • 2012-04-18
      相关资源
      最近更新 更多