如果hascode函数为false而equal函数为true会发生什么

时间:2019-06-10 10:24:10

标签: java equals hashcode

我在考虑一个问题,如果哈希码函数为假,但相等函数为真,会发生什么?例如:

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));
    }
}

1 个答案:

答案 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对象,从而导致该集合包含重复项。)