根据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:这是一个挑战问题,我回答说这是不合法的,但我不确定,因为我第一次看代码,equals
和hashCode
是满足简单契约。
最佳答案
这是合法的(编译器不会提示它),但你不应该这样做。 HashCode
应该一致(给定相同的键返回相同的整数值)。
the
hashCode
method must consistently return the same integer
你的hashCode
与此完全相反。
关于Java hashCode 随着时间的推移而变化(不是由于字段),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33519788/