В данном коде останется одна запись со значением Two: Key не переопределяет equals/hashCode, поэтому использует идентичность объекта. Изменение id здесь не меняет его hashCode.
Влияние изменения полей объекта‑ключа на работу HashMap
В данном коде останется одна запись со значением Two: Key не переопределяет equals/hashCode, поэтому использует идентичность объекта. Изменение id здесь не меняет его hashCode.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
В примере создаётся объект класса Key, который выступает в роли ключа для HashMap. После того как объект помещён в карту, его поле id изменяется, а затем тот же объект используется для вставки нового значения. Какое состояние карты будет в итоге: один ключ с новым значением или два отдельных ключа? Объясните, как HashMap обрабатывает такие изменения.
import java.util.HashMap;
import java.util.Map;
public class JetbulbInterview {
public static void main(String[] args) {
Map<Key, String> map = new HashMap<>();
Key key = new Key(1, "1");
map.put(key, "One");
key.id = 22;
map.put(key, "Two");
System.out.println(map);
}
}
class Key {
int id;
String name;
public Key(int id, String name) {
this.id = id;
this.name = name;
}
}
Ответ
В данном коде останется одна запись со значением Two: Key не переопределяет equals/hashCode, поэтому использует идентичность объекта. Изменение id здесь не меняет его hashCode.
Второй put получает ту же ссылку и заменяет прежнее значение. Вывод ключа будет стандартным Key@..., потому что toString тоже не переопределён. Если бы equals/hashCode зависели от id, изменение поля после вставки нарушило бы контракт ключа и могло оставить недоступную старую запись. Но к показанному классу этот распространённый сценарий не относится.