What happens when a duplicate key is put into a HashMap?
Что происходит, когда дубликат ключа помещается в хэш-карту?
Если я передам один и тот же ключ несколько раз методу HashMap’s put, что произойдет с исходным значением? И что, если даже значение повторится? Я не нашел никакой документации по этому поводу.
Пример 1: Перезаписанные значения для ключа
Mapmymap=newHashMap(); mymap.put("1","one"); mymap.put("1","not one"); mymap.put("1","surely not one"); System.out.println(mymap.get("1"));
Получаем surely not one.
Случай 2: дублирующее значение
Mapmymap=newHashMap(); mymap.put("1","one"); mymap.put("1","not one"); mymap.put("1","surely not one"); // The following line was added: mymap.put("1","one"); System.out.println(mymap.get("1"));
Получаем one.
Но что происходит с другими значениями? Я преподавал основы студенту, и меня спросили об этом. Это Map похоже на корзину, где упоминается последнее значение (но в памяти)?
Переведено автоматически
Ответ 1
По определению, команда put заменяет предыдущее значение, связанное с данным ключом в map (концептуально похоже на операцию индексации массива для примитивных типов).
Карта просто удаляет ссылку на значение. Если ничто другое не содержит ссылки на объект, этот объект становится пригодным для сборки мусора. Кроме того, Java возвращает любое предыдущее значение, связанное с данным ключом (или null если его нет), так что вы можете определить, что там было, и при необходимости сохранить ссылку.
Вы можете найти свой ответ в javadoc из Map#put(K, V) (который на самом деле что-то возвращает):
public V put(K key, V value)
Указанное значение связывается с указанным ключом в этой карте (необязательная операция). Если карта ранее содержала сопоставление для этого ключа, старое значение заменяется на указанное значение. (Говорят, что карта m содержит отображение для ключа, kесли и только если m.containsKey(k)будет возвращать true.)
Параметры:
key - ключ, с которым должно быть связано указанное значение.
value - значение, которое должно быть связано с указанным ключом.
ВОЗВРАТ: предыдущее значение, связанное с указанным ключом, или null если для key не было сопоставления. (null Возврат также может указывать на то, что карта ранее была связана null с указанным key, если реализация поддерживает null значения.)
Итак, если вы не присваиваете возвращаемое значение при вызове mymap.put("1", "a string"), на него просто не ссылаются и, следовательно, он подходит для сборки мусора.
Ответ 3
это функция ключа / значения, и вы не могли бы иметь дубликат ключа для нескольких значений, потому что, когда вы хотите получить фактическое значение, какое из значений принадлежит введенному ключу в вашем примере, когда вы хотите получить значение "1", какое именно ?! это причины иметь уникальный ключ для каждого значения, но вы могли бы использовать трюк со стандартной библиотекой java :
Он заменяет существующее значение в map на соответствующий ключ. И если не существует ключа с таким же именем, то создается ключ с указанным значением. например: