【问题标题】:hashCode() and key hash in HashMapHashMap 中的 hashCode() 和 key hash
【发布时间】:2018-06-27 00:37:31
【问题描述】:

假设String A = "c"Character B = 'c'

我知道A.hashCode() == B.hashCode()A.equals(B) == false

但是,如果您将 A 放入 HashMap 作为密钥。然后调用 hashMap.contains(B) 返回 false,尽管它们具有相同的 hashCode。下面是Java如何实现HashMap中的一些功能。

public boolean containsKey(Object key) {
    return getNode(hash(key), key) != null;
}
static final int hash(Object key) {
    int h;
    return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);
}

如您所见,HashMap 仅对密钥的hashCode() 进行操作。那为什么contains() 可以返回false

【问题讨论】:

  • 你确定A.equals(B) 是真的吗?
  • 为什么你认为它是“只对密钥的 hashCode 进行操作”? key 也被传递给 getNode,而不仅仅是它的哈希码。
  • String 中重载的equals 方法将给定的参数转换为String,因此不能将字符B 直接传递给equals 方法。

标签: java hashmap hashtable hashcode


【解决方案1】:

第一个A.equals(B) 是假的而且String.equals(Object o) 有这个代码

if (anObject instanceof String) {
 //comparing strings
} 
return false;

还有containsKey() 调用getNode(),它使用equals 来区分相等的对象和具有相同hashCode 的对象(哈希冲突)。

【讨论】:

    【解决方案2】:

    为什么 contains 会返回 false?

    getNode 可能会返回 null。这意味着没有找到带有key 的节点。散列函数只是对key 进行散列,而HashMap 中不可用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-12-20
      • 2020-11-28
      • 2015-10-12
      • 2017-03-30
      • 2014-06-15
      • 2019-12-02
      • 1970-01-01
      相关资源
      最近更新 更多