java - HashMap 中的 hashCode() 和键哈希

标签 java hashmap hashtable hashcode

假设字符串 A = "c"字符 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) 为 false 而且 String.equals(Object o) 有此代码

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

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

关于java - HashMap 中的 hashCode() 和键哈希,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48312832/

相关文章:

java - SplitPane 布局问题

java - 在 HashMap 中增加一个整数

c++ - C++中的内置哈希表

Java:具有相同键的 map 的 map

java - 从 GitHub 获取 OAuth 访问 token 时出现 Cookie 错误

java - 将字符串从字节数组转换为 int

java - 设置 DatePickerDialog 获取 IllegalArgumentException 的最小日期 Fromdate 不在 toDate 之前

go - 如何在golang中将字节数组转换为map[string,string]

使用名称值对的 Android Volley 发布请求

链式哈希表声明