Пожалуйста, рассмотрите следующий фрагмент кода:
HashSet hs = new HashSet();
hs.add("hi"); -- (1)
hs.add("hi"); -- (2)
hs.size()
даст 1, поскольку HashSet
не допускает дублирования, поэтому будет сохранен только один элемент.
Я хочу знать, если мы добавим дублирующий элемент, то он заменит предыдущий элемент или просто не добавит его?
Кроме того, что будет использоваться HashMap
для того же случая?
java
hashmap
duplicates
hashset
Ананд
источник
источник
HashMap
чтобы увидеть, существует лиkey
уже, прежде чем вызыватьput
поддержкуmap
?Set
, который никогда не заменяетсяput()
операцией.Set
, но только что понял, чтоput()
переопределит только значение, а не ключ. В этом случае это то же самое значение, которое снова ставится рядом с ключом, что может быть лучше, а не проверять, существует ли ключ и вводить его. В любом случае, я понимаю, как это работает.HashSet
реализации в формеHashMap
. Трудно знать, хотя, если вы не являетесь одним из разработчиков классов.Первое, что вам нужно знать, это то , что вы
HashSet
действуете как aSet
, что означает, что вы добавляете свой объект непосредственно в,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
, он был вставлен.источник
HashMap allows duplicate values
HashMap заменяет старое значение новым.Эти документы довольно ясно по этому вопросу :
HashSet.add
не заменить:Но будет заменить:
HashMap.put
источник
Это случай HashSet, он НЕ заменяет его.
Из документов:
http://docs.oracle.com/javase/6/docs/api/java/util/HashSet.html#add(E )
"Добавляет указанный элемент в этот набор, если он еще не существует. Более формально, добавляет указанный элемент e к этому набору, если этот набор не содержит элемент e2 такой, что (e == null? E2 == null: e.equals ( e2)). Если этот набор уже содержит элемент, вызов оставляет набор без изменений и возвращает false. "
источник
Поправьте меня, если я ошибаюсь, но вы понимаете, что со строками "Hi" == "Hi" не всегда получается (потому что они не обязательно являются одним и тем же объектом).
Причина, по которой вы получаете ответ 1, заключается в том, что JVM будет повторно использовать строковые объекты, где это возможно. В этом случае JVM повторно использует строковый объект и, таким образом, перезаписывает элемент в Hashmap / Hashset.
Но вам не гарантируется такое поведение (потому что это может быть другой строковый объект с тем же значением «Привет»). Поведение, которое вы видите, просто из-за оптимизации JVM.
источник
Вы должны сначала проверить метод put в Hash map, так как HashMap поддерживается HashMap
источник
Чтобы сказать это по-другому: Когда вы вставляете пару ключ-значение в HashMap, где ключ уже существует (в некотором смысле hashvalue () дает одно и то же значение, а true () имеет значение true, но эти два объекта по-прежнему могут отличаться несколькими способами). ), ключ не заменяется, но значение перезаписывается. Ключ просто используется, чтобы получить hashvalue () и найти значение в таблице вместе с ним. Поскольку HashSet использует ключи HashMap и устанавливает произвольные значения, которые в действительности не имеют значения (для пользователя), в результате элементы набора также не заменяются.
источник
HashMap
в основном содержит,Entry
который впоследствии содержитKey(Object)
и.Value(Object)
ВнутреннеHashSet
являетсяHashMap
иHashMap
действительно заменяет значения, как некоторые из вас уже указали ... но действительно ли он заменяет ключи ??? Нет ... и это хитрость здесь.HashMap
сохраняет его значение в качестве ключа в базовомHashMap
файле, а значение - просто фиктивный объект. Так что, если вы пытаетесь переустановить то же значение в HashMap (ключ в базовой карте). Он просто заменяет фиктивное значение, а не ключ (значение для HashSet).Посмотрите на приведенный ниже код для класса HashSet:
Здесь e - значение для HashSet, но ключ для базовой map.and ключ никогда не заменяется. Надеюсь, я смогу убрать путаницу.
источник