task21.task2104

Задача решена!!! 
Хочу уточнить пару возникших вопросов.
1) Почему при создании нового объекта Solution вызывается метод hashCode()?
   Хотя фактически нет указаний на его вызов.
2) Мы вызываем метод contains(), а исполняется метод equals() ?



public class Solution {
    private final String first, last;

    public Solution(String first, String last) {
        this.first = first;
        this.last = last;
    }

    @Override
    public boolean equals(Object o) {
          *************
            }

    @Override
    public int hashCode() {
        ***************
    }

    public static void main(String[] args) {
        Set<Solution> s = new HashSet<>();
        s.add(new Solution("Donaldadd", "Duckfff"));
        System.out.println(s.contains(new Solution("Donald", "Duck")));
    }
}

2 комментария

vampirit
А что делает метод contains?

Проверяет есть ли объект в сете. А как это проверить? Пробежавшись по всем объектам и найти похожий.
Нет похожего — значит нет в сете…

А за сравнение отвечают методы hashCode и equals. Сначала идет сравнение по hashCode'у
«2 одинаковых объекта 100% имеют одинаковых хешкод. Если объекты разные, то оно все равно могут иметь одинаковый хешкод»

Хешкод это беглый просмотр. Это как если в куче черных носков вы пытаетесь найти белый. Вы не станете каждый рассматривать, а трехнете все и осмотрите, белое на черном хорошо видно. А хешкод сильно экономит ресурсы и время, т.к. сравнить надо небольшую цифровую строку, а не огромный объект

Когда вы нашли нужный хешкод, это ещё не значит, что объект нужный. Носок может быть молочного или бежевого цвета. Теперь в бой идет equals и он то, сравнивает по полной.

А если я плохо объяснил, тот тут есть статься про equals и hashCode. Ну или в комментах спросите
Artem_Novikov
Разве про это в лекциях не говорится?
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.