как изменить ссылку на объект hashmap - PullRequest
2 голосов
/ 30 мая 2019

Попытка проверить, как работает hashmap

public class hashmapcheck {
public static void main(String args[]) {
    Person abhishek = new Person("abhishek");
    Map<Person,String> mapCheck = new HashMap<Person,String>();
    mapCheck.put(abhishek,"ancd");
    abhishek.setName("defg");
    System.out.println(mapCheck.get(abhishek));  //line which i try to undertand
}

}

public class Person {
public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}

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

String name;

@Override
public boolean equals(Object o) {
    if (this == o) return true;
    if (o == null || getClass() != o.getClass()) return false;

    Person person = (Person) o;

    return name != null ? name.equals(person.name) : person.name == null;
}

@Override
public int hashCode() {
    return name != null ? name.hashCode() : 0;
}

}

, если равно и хеш-код не переопределяется для класса лица, он печатает ancd, нокогда я переопределю это, он напечатает нольТо, что я думал, когда я храню объект в hashmap, он будет хранить ссылку на этот hashmap, что идет не так

1 Ответ

8 голосов
/ 30 мая 2019

abhishek.setName("defg") изменяет ключ вашего HashMap (экземпляр Person) после того, как вы добавили его к HashMap.

Это приводит к изменению hashCode() этого ключа, поэтому метод get() не может найти его в соответствии с новым hashCode() (так как он был помещен в корзину, которая соответствует исходному hashCode().

Вы неправильно используете класс HashMap. Ключи не должны быть видоизменены после добавления в HashMap (по крайней мере свойства, которые влияют на результат hashCode и equals, не должны быть видоизменены).

Что касается поведения без переопределения equals и hashCode, в этом случае equals asnd hashCode не зависит от значения name, поэтому изменение name делаетбез разницы. В этом случае реализация по умолчанию гарантирует, что ваш ключ может быть найден в HashMap, если вы ищете точно такой же экземпляр Person, который вы поместили в Map.

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