我在考虑一个问题,如果哈希码函数为假,但相等函数为真,会发生什么?例如:
public class Demo {
private int age;
private String name;
//getter
//setter
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Demo demo = (Demo) o;
return age == demo.age &&
Objects.equals(name, demo.name);
}
@Override
public int hashCode() {
return Objects.hash(age, name)
+ (new Random().nextInt(1000));
}
}
答案 0 :(得分:0)
将发生的情况是,Demo
类的实例在用作哈希键时将无法正确运行。
这是将要发生的事的一个例子。
Demo demo = new Demo(...);
HashSet<Demo> set = new HashSet<>();
set.add(demo);
System.out.println(set.contains(demo)); // will print false 99.9% of the time.
换句话说,从HashSet
方法的角度来看,contains
将失去跟踪元素。 (但是,如果您迭代集合,它们仍将在那里。并且您可能可以两次添加相同的Demo
对象,从而导致该集合包含重复项。)