我有一个对象有一个field- double [] _myField 它的哈希码是
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + Arrays.hashCode(_myField);
return result;
}
但是,如果我将对象用作Map中的键,我会得到以下奇怪的行为:
for (Map.Entry<MyObject, String> entry: _myMap.entrySet())
{
if (entry.getValue() != _myMap.get(entry.getKey()))
{
System.out.println("found the problem the value is null");
}
}
我能想到上述IF语句为真的唯一原因是我得到了一个不同的密钥哈希码。
实际上,我已经将hashcode函数更改为在所有情况下都返回1。效率不高,但对调试很有用,而且IF语句总是错误的。
Arrays.hashcode()有什么问题?
请注意(阅读一些评论后): 1)至于在IF语句中使用!=,它确实比较了引用,但在上面的例子中它应该是相同的。无论如何,奇怪的是右手边返回NULL 2)至于发布Equals功能。当然我已经实现了它。但这无关紧要。在调试中跟踪代码表明只调用了哈希码。原因可能是奇怪的是,返回的哈希码与原始哈希码不同。在这种情况下,Map找不到匹配的条目,因此不需要调用Equals。
答案 0 :(得分:5)
数组在地图中是否被更改?因为这会改变结果的结果。
答案 1 :(得分:2)
实现hashCode是不够的。您还需要实现equals对象。事实上,无论何时为对象实现hashCode,您都必须实现equals。那两个人一起工作。
您需要为对象实现equals,并确保只要两个对象的equals为true,它们的hashCode也匹配。
答案 2 :(得分:0)
尝试在干净的平板上重现问题,发现它不可再现。
因此,进一步的调查显示问题是 当对象存储在地图中时,用于哈希的_myField被更改。 正如预期的那样,地图已损坏。
抱歉那些试图回答错误问题的人浪费了时间。