Что будет если hashcode объекта в HashMap поменяется?
Я знаю, что если поменять любое поле объекта, которое является ключом в HashMap, то hashcode этого объекта поменяется. Вопрос, можно ли как то получить доступ к потерянному объекту в hashmap (getValue())? Если ссылки(ключи) не указывают на этот объект удалит ли его сборщик мусора из кучи?
Ответы (1 шт):
Автор решения: Serodv
→ Ссылка
Найти можно. Для этого надо проитерировать все бакеты и найти в ключе именно тот объект:
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; } }- GC вхождение не удалит. Если надо чтобы удаляло, вернее чтобы сделать ненулевой вероятность удаления, то используется
WeakHashMap.
- GC вхождение не удалит. Если надо чтобы удаляло, вернее чтобы сделать ненулевой вероятность удаления, то используется