Java - Почему делает Map.put () перезаписывает, в то время как Set.add () не делает?

Я задаюсь вопросом, что объяснение находится позади наличия Java Map.put(key, value) перезапись метода эквивалентно key'd значения, которые уже находятся в наборе, в то время как Set.add(value) не перезаписывает существующую ранее эквивалентную стоимость, которая уже находится в наборе?

Править:

Похоже, что точка зрения большинства состоит в том, что объекты в наборе, которые оценивают к равенству, должны быть равными во всех отношениях, таким образом не должно иметь значения, если Set.add (Объект) перезаписывает эквивалентно ценные объекты или нет. Если два объекта оценивают к равенству, но действительно на самом деле содержат различные данные, то набор типа Карты является более соответствующим контейнером.

Я несколько не соглашаюсь с этой точкой зрения.
Пример: набор, содержащий группу объектов "Человека". Для обновления некоторой информации о том человеке Вы могли бы хотеть передать набор новое, обновленный, человек возражает для перезаписи старого, устаревшего объекта человека. В этом случае Человек удержал бы первичную клавишу, которая определяет, что человек и набор идентифицировали бы и сравнили бы людей, базирующихся только на их первичных ключах. Этот первичный ключ является частью идентификационных данных человека в противоположность внешней ссылке, такой как Карта, подразумевал бы.

21
задан Chris Dutrow 4 June 2010 в 23:27
поделиться

3 ответа

Поведение Map позволяет изменять значения, связанные с эквивалентными ключами. Это довольно распространенный вариант использования: a: b становится a: c .

Да, перезапись содержимого Set с помощью add может что-то изменить (эталонное значение), но это кажется довольно узким вариантом использования (который в любом случае может быть выполнен - ​​всегда пытайтесь удалить перед добавлением: s.remove (o); s.add (o); ) относительно того, что можно было бы получить в большинстве случаев - ничего для циклов.

edit:

единственное возможное применение, которое я мог видеть для этого поведения, - это ограниченный бюджет памяти, создание множества тяжелых, но эквивалентных объектов и наличие ссылок на разные равные версии в разных местах, предотвращение мусора сбор дубликатов. Однако, столкнувшись с этой проблемой раньше, я не думаю, что такое поведение даже лучший способ ее решить.

9
ответ дан 29 November 2019 в 22:03
поделиться

На мой взгляд, нет смысла перезаписывать что-то в Set, так как ничего не изменится.

Однако, когда вы обновляете карту, ключ может быть таким же, но значение может быть другим.

5
ответ дан 29 November 2019 в 22:03
поделиться

Я не согласен с предпосылкой вашего вопроса. И Map, и Set - абстрактные интерфейсы. Перезаписывают они или нет - это деталь реализации.

  1. реализация карты , которая не перезаписывает .
  2. Вы можете создать изменяемый одноэлементный набор - добавление материала к набору перезаписывает существующее одноэлементное значение.
0
ответ дан 29 November 2019 в 22:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: