Переопределение метода equals не работает при использовании объекта в качестве ключа в hashmap? - PullRequest
0 голосов
/ 24 февраля 2019

У меня есть метод Overridden equals класса Person, сравнивающий атрибут name класса и, если они равны, возвращает значение true из метода equals.

Когда я создаю экземпляр объекта Person и использую его как ключ вhashmap, при получении с использованием нового объекта с тем же именем я не могу получить обратно связанное значение из hashMap.

Ниже мой

import java.util.HashMap;

import java.util.Map;

открытый класс ToStringTest {

public static void main(String[] args) {

    Person person = new Person("Jack", "California");
    Map<Person,String> personsMap = new HashMap<>();
    personsMap.put(person,"MyCar");
   Person otherPerson = new Person("Jack", "California");
    System.out.println(personsMap.get(otherPerson));
}

}

класс Person {

String name;
String city;

public Person(String name, String city) {
    this.name = name;
    this.city = city;
}

@Override
public String toString() {
    return "Name : " + this.name + ", City : " + this.city;
}

@Override
public boolean equals(Object o) {

    Person person = (Person) o;
    if(person.name.equals(this.name)){
        return true;
    }

    return false;
}

}

Это печать ноль при полученииот использования объекта otherPerson.

Может кто-нибудь объяснить, пожалуйста, это поведение.

1 Ответ

0 голосов
/ 24 февраля 2019

Когда вы добавляете нового человека в карту personsMap.put(person,"MyCar"); прежде всего, если ключ не равен нулю, определяется позиция, в которой будет размещен элемент.Это определяется вызовом метода hashcode для ключа.После этого есть несколько шагов, но это не имеет значения для этого примера.

Поскольку вы не переопределяете hashcode(), ваши person и otherPerson будут отличаться hashcode.

То же самое происходит, когда вы пытаетесь получить значение по некоторому ключу.Чтобы найти положение, в котором находится элемент, будет вызвано hashcode().Но otherPerson имеет другой hashcode, и это приведет к позиции, в которой элемент не используется (null)

equals(), когда в одной позиции много элементов (в списке или в древовидной структуре).).Тогда для нахождения нужного предмета они будут сравниваться equals() методом

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...