Необходимо понять метод map.get() после переопределения hashCode и равенства в Java

Я переопределил методы hashCode и equals, как показано ниже, и хочу понять реализацию метода get Map.

public class Student{
    String name;

    Student(String s){
        this.name = s;
    }

    @Override
    public boolean equals(Object o) {
        return false;
    }

    @Override
    public int hashCode() {
        return 111;
    }

    public static void main(String[] args) {
        Map<Student,String> map=new HashMap<>();
        Student ob1=new Student("A");
        Student ob2=new Student("B");
        map.put(ob1,"A");
        map.put(ob2,"B");
        System.out.println(map.get(ob1));
    }
}

Я попробовал запустить map.get(), ожидая null результата, потому что ключ никогда не будет найден, потому что метод equals() всегда будет возвращать false, но в этом случае я получаю результат как A.

Напоминаем, что другие реализации карты или аналогичной структуры данных могут с самого начала полагаться на равенство. Итак, сначала проверьте равенство ссылок. Т.е. if (o == name) return true;

WJS 06.07.2024 22:07
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
5
1
143
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

HashMapgetпроверяет равенство с помощью == перед использованием равенства.

Таким образом, тот факт, что вы используете тот же объект, который использовали в качестве ключа (а не объект с тем же содержимым, но с другой ссылкой), заставляет get работать.

Если вы попробуете этот способ

public static void main(String[] args) {
    Map<Student,String> map=new HashMap<>();
    Student ob1=new Student("A");
    Student ob2=new Student("B");
    Student keyTest = new Student("A");
    map.put(ob1,"A");
    map.put(ob2,"B");
    System.out.println(map.get(keyTest)); //different key here
}

он печатает null.

Интересно, что в стандартной equals реализации для каждого значения, хешированного с конкретным "bucket", эти значения обычно проверяются дважды на ссылочное равенство, пока не будет найдено совпадение. Один раз в реализации карты и один раз в равных.

WJS 06.07.2024 22:17

Другие вопросы по теме