Что будет если hashcode объекта в HashMap поменяется?

Рейтинг: 3Ответов: 1Опубликовано: 19.05.2023

Я знаю, что если поменять любое поле объекта, которое является ключом в HashMap, то hashcode этого объекта поменяется. Вопрос, можно ли как то получить доступ к потерянному объекту в hashmap (getValue())? Если ссылки(ключи) не указывают на этот объект удалит ли его сборщик мусора из кучи?

Ответы

▲ 6Принят
  1. Найти можно. Для этого надо проитерировать все бакеты и найти в ключе именно тот объект:

     Map<MyObject, Integer> map = new HashMap<>();
     MyObject myObject = new MyObject();
     myObject.value = 42;
     map.put(myObject, 1);
     System.out.println(map.get(myObject)); // 1
     myObject.value = 422;
     System.out.println(map.get(myObject)); // null
    
     for (Map.Entry<MyObject, Integer> entry : map.entrySet()) {
         if (entry.getKey() == myObject) {
             System.out.println(entry.getValue()); // 1
         }
     }
    
    
    class MyObject {
      Integer value;
    
      @Override
      public boolean equals(Object o) {
         ...
      }
    
      @Override
    
    
      public int hashCode() {
           return value != null ? value.hashCode() : 0;
      } 
    }
    
    1. GC вхождение не удалит. Если надо чтобы удаляло, вернее чтобы сделать ненулевой вероятность удаления, то используется WeakHashMap.