Заменяет ли добавление повторяющегося значения в HashSet/HashMap Предыдущее значение

пожалуйста, рассмотрите приведенный ниже фрагмент кода:

HashSet hs = new HashSet();
hs.add("hi"); -- (1)
hs.add("hi"); -- (2)

hs.size() даст 1 Как HashSet не разрешает дубликаты, поэтому будет сохранен только один элемент.

Я хочу знать, если мы добавляем дубликат элемента, то заменяет ли он предыдущий элемент или просто не добавляет его?

кроме того, что произойдет черезHashMap для того же случая?

8 ответов


в случае HashMap, оно заменяет старое значение новым.

в случае HashSet элемент не вставлен.


первое, что вам нужно знать, это то, что HashSet действует как Set, что означает, что вы добавляете свой объект непосредственно в HashSet и он не может содержать дубликаты. Вы просто добавляете свое значение непосредственно в HashSet.

однако, HashMap это Map тип. Это означает, что каждый раз, когда вы добавляете запись, вы добавляете пару ключ-значение.

на HashMap вы можете иметь повторяющиеся значения, но не дублировать ключи. В HashMap новая запись заменит старую. Самые последние запись будет в HashMap.

понимание связи между HashMap и HashSet:

помните, что HashMap не может иметь дубликаты ключей. За кулисами HashSet использует HashMap.

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

теперь, когда вы пытаетесь вставить другой дубликат объекта в тот же HashSet, Он снова попытается вставить его в качестве ключа в HashMap лежал под ним. Однако,HashMap не поддерживает дубликаты. Следовательно,HashSet по-прежнему будет иметь только одно значение этого типа. В качестве примечания, для каждого дубликата ключа, поскольку значение, генерируемое для нашей записи в HashSet, является случайным/фиктивным значением, ключ не заменяется вообще. он будет проигнорирован как удаление ключа и добавление того же ключа (фиктивное значение то же самое) не имело бы никакого смысла вообще.

резюме:

HashMap позволяет дублировать values, но не keys. HashSet не может содержать дубликаты.

чтобы играть с Ли добавление объекта успешно завершена или нет, вы можете проверить boolean значение, возвращаемое при вызове .add() и посмотреть, вернется ли он true или false. Если он вернется true, он был вставленный.


на docs довольно ясно об этом:HashSet.add не заменить:

добавляет указанный элемент в этот набор, если он еще не присутствует. Более формально добавляет указанный элемент e к этому набору, если этот набор не содержит элемента e2, такого, что (e==null ? e2= = null: e.равно (e2)). если этот набор уже содержит элемент, вызов оставляет набор без изменений и возвращает false.

но HashMap.put будет заменить:

Если карта ранее содержала отображение для ключа, старое значение заменяется.


Это случай HashSet, он не заменяет его.

документы:

http://docs.oracle.com/javase/6/docs/api/java/util/HashSet.html#add(E)

" добавляет указанный элемент в этот набор, если он еще не присутствует. Более формально добавляет указанный элемент e к этому набору, если этот набор не содержит элемента e2, такого, что (e==null ? e2= = null: e.равно (e2)). Если этот набор уже содержит элемент, вызов оставляет набор без изменений и возвращать false."


поправьте меня, если я ошибаюсь, но то, что вы получаете, это то, что со строками "Hi" == "Hi" не всегда выходит правдой (потому что они не обязательно один и тот же объект).

причина, по которой вы получаете ответ 1, заключается в том, что JVM будет повторно использовать объекты строк, где это возможно. В этом случае JVM повторно использует объект string и, таким образом, перезаписывает элемент в Hashmap/Hashset.

но вам не гарантируется такое поведение (потому что это может быть другой строковый объект, имеющий то же значение "Hi"). Поведение, которое вы видите, связано только с оптимизацией JVM.


вам нужно сначала проверить метод put в хэш-карте, поскольку HashSet поддерживается HashMap

  1. когда вы добавляете повторяющееся значение, скажите строку " One " в HashSet,
  2. запись ("один", присутствует) будет вставлена в Hashmap(для всех значения, добавленные в набор, значение будет "PRESENT", которое, если типа Object)
  3. Hashmap добавляет запись в карту и возвращает значение, которое в этом случае "PRESENT" или null, если запись не там.
  4. метод add Hashset затем возвращает true, если возвращаемое значение из Hashmap равно null в противном случае false, что означает, что запись уже существует...

сказать по-другому: когда вы вставляете пару ключ-значение в HashMap, где ключ уже существует (в некотором смысле hashvalue () дает то же значение und equal () верно, но два объекта все еще могут отличаться несколькими способами), ключ не заменяется, но значение перезаписывается. Ключ просто используется для получения hashvalue () и поиска значения в таблице с ним. Поскольку HashSet использует ключи HashMap и устанавливает произвольные значения, которые на самом деле не имеют значения (для пользователя), в результате Элементы набора также не заменяются.


HashMap в основном содержит запись, которая впоследствии содержит ключи(объект) и значение (объект).Внутренне HashSet являются HashMap и HashMap do заменяет значения, как некоторые из вас уже указали..но действительно ли он заменяет ключи???Нет..и в этом весь фокус.HashMap сохраняет свое значение в качестве ключа в базовом HashMap, а value - просто фиктивный объект.Поэтому, если вы попытаетесь повторно ввести то же значение в HashMap(ключ в базовой карте).Он просто заменяет фиктивное значение, а не ключ(значение для Для поиска HashSet).

посмотрите на приведенный ниже код для класса HashSet:

public boolean [Подробнее ...] добавить(E e) {

   return map.put(e, PRESENT)==null;
}

здесь e-значение для HashSet, но ключ для базовой карты.и ключ никогда не заменяется. Надеюсь, я смогу устранить путаницу.