Java Arrays.hashcode()奇怪的行为

时间:2011-11-02 13:19:14

标签: java arrays hashcode

我有一个对象有一个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。

3 个答案:

答案 0 :(得分:5)

数组在地图中是否被更改?因为这会改变结果的结果。

答案 1 :(得分:2)

实现hashCode是不够的。您还需要实现equals对象。事实上,无论何时为对象实现hashCode,您都必须实现equals。那两个人一起工作。

您需要为对象实现equals,并确保只要两个对象的equals为true,它们的hashCode也匹配。

答案 2 :(得分:0)

尝试在干净的平板上重现问题,发现它不可再现。

因此,进一步的调查显示问题是 当对象存储在地图中时,用于哈希的_myField被更改。 正如预期的那样,地图已损坏。

抱歉那些试图回答错误问题的人浪费了时间。

相关问题