Java hashCode 随着时间的推移而变化(不是由于字段)

标签 java equals hashcode

根据hashCode/equals契约,如果两个对象相等,则必须具有相同的hashCode - 至少我是这么知道的它。考虑以下实现:

package Happy;

import java.time.LocalDate;

class MyClass
{
    private int id;

    public int getId()
    {
        return id;
    }

    public MyClass(int id)
    {
        this.id = id;
    }

    public int hashCode()
    {
        return LocalDate.now().getYear() + getId();
    }

    public boolean equals(Object obj)
    {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        MyClass other = (MyClass) obj;
        if (hashCode() != other.hashCode())
            return false;
        return true;
    }
}

public class HappyNewYear
{
    public static void main(String[] args) {
        MyClass my = new MyClass(0);
        if (my.hashCode() != my.hashCode()) System.out.println("Happy New Year!");
    }
}

只需稍加修改,我们就可以得到一个不太极端的变体:

public int hashCode()
{
    return return (int) (System.nanoTime() + getId());
}

我测试了它(尽管没有使用 getYear),并且条件为真(hashCodes 不相等)。

即使对象的字段未修改,如果 hashCode 随着时间的推移而变化,这是否合法?我找不到有关此特定实现的任何资源。 我知道集合的问题,但我的问题是 hashCode 实现是否合法根据契约(Contract)/规范

PS:这是一个挑战问题,我回答说这是不合法的,但我不确定,因为我第一次看代码,equalshashCode是满足简单契约。

最佳答案

这是合法的(编译器不会提示它),但你不应该这样做。 HashCode 应该一致(给定相同的键返回相同的整数值)。

来自 Java Docs of hashCode

the hashCode method must consistently return the same integer

你的hashCode与此完全相反。

关于Java hashCode 随着时间的推移而变化(不是由于字段),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33519788/

相关文章:

java - 为什么ConcurrentHashMap在1.8中用0x7fffffff计算hashcode?

java - AppWidgetProvider : having trouble with variables

java - 红黑树<黑色高度>(重新草稿)

C++ wchar_t * 等于对其他 wchar_t * 不区分大小写

java - 基于Object Class的hashcode实现

objective-c - 检查 CMTime 等于

java - 无法*正确*写入java文件

java - Webdriver - 元素可以正确定位,但无法交互。仅限火狐浏览器

java - 高效的哈希码函数

java - Nashorn,Java 集合,如何在纯 javascript 中实现 equals 和 hashCode