java - 哈希码未正确哈希

标签 java hashmap hashcode string-hashing

我已经为此类编写了一个hashcode 函数,但出于某种原因,hashmap 无法正确识别HashMap 中实际存在键的时间。 (坐标是一个字符串)

@Override
public int hashCode() {
    return coordinates.hashCode();
}

并且我还为用于测试两对坐标是否彼此相等的类编写了一个.equals方法;但是,为了验证我的哈希码方法是否正常工作,我已将 .equals 方法切换为以下方法。

public boolean equals(Object arg) {
    Block a = (Block) arg;
    return hashCode() == a.hashCode();
}

它们都在别处通过 hashmap.containskey() 调用调用,如下所示:

return (hashblocks.containsKey(newz));

出于某种原因,这只会返回 true ~ 50% 的时间应该返回(我们甚至重新输入完​​全相同的情况,有时它有效,有时却无效)我在过去尝试时遇到了很多问题get 包含为 HashMapSet 正常工作的方法,我想知道为什么这个实现特别有困难。 (基本上,错误可能是什么)

3 1 3 1
true
4 2 4 2
false
 0 0 1 0
 0 3 1 3
 2 0 3 0
 2 3 3 3
0 1 1 2
2 1 2 2
4 0 4 0
4 2 4 2
3 1 3 1
3 2 3 2

3 1 3 1
true
4 2 4 2
true
3 2 3 2
true
 0 0 1 0
 0 3 1 3
 2 0 3 0
 3 3 4 3
0 1 1 2
2 1 2 2
4 0 4 0
4 2 4 2
3 1 3 1
3 2 3 2

查询后跟它的结果,一长串数字表示所有键后跟一个换行符

最佳答案

to verify that my hashcode method is working correctly I've switched the .equals method to the following.

return hashCode()==a.hashCode();

这仅在“完美散列”的情况下有效,即当散列码相等意味着实际值相等时。 Java 中String 的哈希码并不完美(事实上,即使在理论上,它们也不可能对所有可能的字符串都是完美的)。

您需要使相等性检查与哈希码保持一致 - 在您的情况下,这将检查 坐标 的相等性:

public boolean equals(Object arg) {
    Block a = (Block) arg;
    return coordinates.equals(a.coordinates);
}

关于java - 哈希码未正确哈希,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25340143/

相关文章:

java - 在 ubuntu 上安装 java...我的 java 主页是什么?

java - 隐式类型和通配符

java - HashMap.containsKey() 返回 false。为什么?

java - Object.hashCode() 方法中发生了什么?

java - 覆盖哈希码和等于的问题

c# - 为具有条件相等的 IEqualityComparer<T> 实现 GetHashCode

java - ResultSetMetaData 是否为空?

java - 将类添加到 Android 中的 list 中

java - 无法使用三元运算符更新HashMap的值

我的 HashMap 实现的性能改进