Что произойдет, если функция hascode равна false, а функция равенства равна true - PullRequest
0 голосов
/ 10 июня 2019

Я подумываю над вопросом, если функция хэш-кода имеет значение false, а функция равенства равна true, что произойдет? Например:

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 голосов
/ 06 июля 2019

Что произойдет, так это то, что экземпляры класса 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 дважды ..., что приведет к набору, содержащему дубликаты.)

...