是否向HashSet / HashMap添加重复值会替换先前的值

时间:2012-10-17 18:14:15

标签: java hashmap duplicates hashset

请考虑以下代码:

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

hs.size()会给{1 HashSet不允许重复,因此只会存储一个元素。

我想知道我们是否添加了重复元素,然后它是否替换了前一个元素,或者它根本就没有添加它?

此外,使用HashMap对同一案件会发生什么?

8 个答案:

答案 0 :(得分:213)

HashMap的情况下,它将旧值替换为新值。

如果是HashSet,则不会插入该项目。

答案 1 :(得分:42)

您需要知道的第一件事是HashSet就像Set一样,这意味着您将对象直接添加到HashSet,并且不能包含重复项。您只需在HashSet中直接添加您的值即可。

但是,HashMapMap类型。这意味着每次添加条目时,都会添加一个键值对。

HashMap中,您可以拥有重复值,但不能重复键。在HashMap中,新条目将替换旧条目。最近的条目将在HashMap

了解HashMap和HashSet之间的链接:

请记住,HashMap不能有重复的密钥。在幕后HashSet使用HashMap

当您尝试将任何对象添加到HashSet时,此条目实际上存储为HashMap中的密钥 - 与{{{}}场景后面使用的HashMap相同1}}。由于此基础HashSet需要键值对,因此会为我们生成虚拟值。

现在,当您尝试将另一个重复对象插入同一个HashMap时,它将再次尝试将其作为键插入位于下方的HashSet中。但是,HashMap不支持重复项。因此,HashMap仍将导致只有该类型的一个值。作为旁注,对于每个重复键,由于为HashSet中的条目生成的值是一些随机/虚拟值,因此根本不替换该键。它将被忽略,因为删除密钥并添加相同的密钥(虚拟值相同)根本没有任何意义。

<强>要点:

HashSet允许重复HashMap,但不允许valueskeys不能包含重复项。

要了解是否成功完成了对象的添加,您可以检查调用HashSet时返回的boolean值,看看它是否返回.add()或{{ 1}}。如果它返回true,则表示已插入。

答案 2 :(得分:17)

docs非常明确:HashSet.add 不会替换:

  

如果指定的元素尚不存在,则将其添加到此集合中。更正式地,如果此集合不包含元素e2(e == null?e2 == null:e.equals(e2)),则将指定元素e添加到此集合。 如果此set已包含该元素,则调用将保持set不变并返回false。

HashMap.put 替换:

  

如果地图以前包含该键的映射,则替换旧值。

答案 3 :(得分:4)

就HashSet而言,它不会取代它。

来自文档:

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

“如果指定的元素不存在,则将其添加到此集合。更正式地,如果此集合不包含元素e2,则将指定的元素e添加到此集合中(e == null?e2 == null:e .equals(e2))。如果此set已包含该元素,则调用将保持set不变并返回false。“

答案 4 :(得分:1)

如果我错了,请纠正我,但是你得到的是字符串,“你好”==“你好”并不总是真实的(因为它们不一定是同一个对象)。 / p>

您获得1答案的原因是因为JVM将尽可能重用字符串对象。在这种情况下,JVM重用字符串对象,从而覆盖Hashmap / Hashset中的项目。

但是你不能保证这种行为(因为它可能是一个具有相同值“Hi”的不同字符串对象)。您看到的行为仅仅是因为JVM的优化。

答案 5 :(得分:0)

首先需要在哈希映射中检查put方法,因为HashSet由HashMap备份

  1. 当您添加重复值时,请说一个字符串&#34; One&#34;进入HashSet,
  2. 一个条目(&#34;一个&#34;,PRESENT)将被插入到Hashmap中(对于所有 将值添加到集合中,该值将为&#34; PRESENT&#34;哪个类型为Object)
  3. Hashmap将该条目添加到Map中并返回该值,在本例中为 &#34; PRESENT&#34;如果没有Entry,则返回null。
  4. 如果Hashmap返回的值等于,则Hashset的add方法返回true null否则为false表示条目已存在...

答案 6 :(得分:0)

换句话说:当你将一个键值对插入到已存在键的HashMap中时(在某种意义上,hashvalue()给出相同的值而und equal()为true,但这两个对象仍然可以不同在几个方面),密钥不会被替换,但值被覆盖。该密钥仅用于获取hashvalue()并使用它在表中查找值。 由于HashSet使用HashMap的键并设置任意值(对用户而言)并不重要,因此Set的元素也不会被替换。

答案 7 :(得分:0)

HashMap基本上包含Entry,后面包含Key(Object)Value(Object)。内部HashSet HashMapHashMap取代像你们中的一些人已经指出的那样的价值。但它真的取代了钥匙吗?不......这就是诀窍。 HashMap将其值保留为底层HashMap中的键,值只是一个虚拟对象。如果你尝试在HashMap中重新插入相同的值(基础Map中的键)。它只是替换虚拟值和而不是Key(HashSet的值)。

请查看以下HashSet类代码:

public boolean  [More ...] add(E e) {

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

这里e是HashSet的值,但是底层map的键。永远不会替换key。希望我能够清除这种混乱。