Может ли кто-нибудь объяснить приведенный ниже код Как это работает? - PullRequest
0 голосов
/ 10 июля 2019

У меня есть пользовательский класс, который переопределил hashcode() и equals() метод

class Employee1{
private int id;
public int getId() {
    return id;
}
public void setId(int id) {
    this.id = id;
}
public Employee1(int id) {
    super();
    this.id = id;
}
@Override
public int hashCode() {
    final int prime = 31;
    int result = 1;
    result = prime * result + id;
    return result;
}
@Override
public boolean equals(Object obj) {
    if (this == obj)
        return true;
    if (obj == null)
        return false;
    if (getClass() != obj.getClass())
        return false;
    Employee1 other = (Employee1) obj;
    if (id != other.id)
        return false;

    return true;
}

}

, а в основном классе я использую Map, имеющий Objectкак Key

Map<Integer,Employee1> g = new HashMap<>();
    Employee1 e = new Employee1(1);
    Employee1 e1 = new Employee1(2);
    g.put(1, e);
    g.put(2, e1);
    Employee1 e4 = g.get(1);
    e4.setId(3);
    for(Map.Entry<Integer,Employee1> e3:g.entrySet()) {
       System.out.println(e3.getKey()+" "+e3.getValue().getId());
    }

Мой вопрос: почему ключ карты изменяется, хотя я переопределил методы hashcode и equals, ключ должен быть таким же, но я могу получить иустановите идентификатор и его отражение в map

o / p для вышеуказанного кода:

1 3 2 2

Ответы [ 2 ]

0 голосов
/ 10 июля 2019

"почему ключ карты изменился" - он не меняется , так как вы можете видеть 1 и 2 в выходных данных, которые вы изначально использовали вput.

То, что вы можете изменить, это содержимое того, на что указывает объект внутри карты, значение.Карта не копирует Employee1, когда вы помещаете ее в карту, она сохраняет ссылку на тот же экземпляр, который вы знаете как e.Если вы получите это значение с карты e4, то теперь это то же самое, что и e.

Является ли Java «передачей по ссылке» или «передачей по значению»? может быть полезным для вас.

Что вам следует никогда сделать - это изменить что-то, что участвует в вычислении hashCode (если есть шанс, что кто-то действительно использует хеш-код).Потому что после изменения хеш-код объекта изменяется, HashMap (или HashSet) не видит изменения, поскольку он не пересчитывает хеш-код, поскольку у него нет возможности узнать, что вы что-то мутировали (релевантно).

0 голосов
/ 10 июля 2019

Методы equals() и hashCode() используются для ключей в HashMap, а не для значений.Чтобы увидеть разницу, вы можете попробовать использовать свой класс Employee1 в качестве значения в Map или просто использовать HashSet<Employee1>, он использует HashMap под капотом.

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