向HashSet / HashMap添加重复值是否replace以前的值

请考虑下面的一段代码:

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

hs.size()会给1,因为HashSet不允许重复,所以只有一个元素将被存储。

我想知道如果我们添加重复的元素,然后它取代了以前的元素,或者它根本不添加它?

另外,使用HashMap会发生什么情况?

HashMap的情况下,它将用新值replace旧值。

HashSet的情况下,该项目不被插入。

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

但是, HashMap是一个Maptypes。 这意味着每次添加条目时,都要添加一个键值对。

HashMap你可以有重复的值,但不能重复键值。 在HashMap ,新条目将replace旧条目。 最近的条目将在HashMap

了解HashMap和HashSet之间的链接:

请记住, HashMap不能有重复的键。 场景后面HashSet使用一个HashMap

当你试图将任何对象添加到HashSet ,这个条目实际上被存储在HashMap一个键 – 与HashSet的场景背后使用的相同的HashMap 。 由于这个底层HashMap需要一个键值对,所以我们会生成一个虚拟值。

现在当你试图插入另一个重复的对象到同一个HashSet ,它会再次试图将它作为一个键插入到下面的HashMap 。 但是, HashMap不支持重复。 因此, HashSet仍然会导致只有一个该types的值。 作为一个方面说明,对于每个重复的键,因为我们在HashSet中input的值是一些随机/虚拟值,所以密钥根本不被replace。 它会被忽略,因为删除键和添加相同的键(虚拟值是相同的)根本没有任何意义。

概要:

HashMap允许重复的values ,但不是keysHashSet不能包含重复项。

要玩对象的添加是否成功完成,您可以检查在调用.add()时返回的boolean值,看它是否返回truefalse 。 如果它返回true ,它被插入。

这个文档很清楚: HashSet.add 不会replace:

如果指定的元素不存在,则将其添加到此集合中。 更正式地说,如果这个集合不包含元素e2(e == null?e2 == null:e.equals(e2)),那么将指定元素e添加到此集合中。 如果这个集合已经包含这个元素,那么这个调用离开这个集合并且返回false。

但是HashMap.put 取代:

如果映射先前包含该键的映射,则replace旧值。

它是HashSet的情况下,它不会取代它。

从文档:

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

如果该集合不包含元素e2(e == null?e2 == null:e.equals()),则将指定的元素添加到此集合中。 e2))。如果这个集合已经包含这个元素,那么这个调用离开这个集合并且返回false。

纠正我,如果我错了,但你得到的是与string,“嗨”==“嗨”并不总是真实的(因为他们不一定是相同的对象)。

你得到1的答案的原因是因为JVM将在可能的情况下重用string对象。 在这种情况下,JVM正在重用string对象,从而覆盖Hashmap / Hashset中的项目。

但是你不能保证这种行为(因为它可能是一个不同的string对象具有相同的值“嗨”)。 你看到的行为只是因为JVM的优化。

您需要首先检查HashMap中的put方法,因为HashSet是由HashMap备份的

  1. 当你添加重复的值说一个string“一”到HashSet,
  2. 一个条目(“一个”,PRESENT)将被插入到Hashmap中(对于添加到集合中的所有值,值将是“PRESENT”,如果types为Object)
  3. Hashmap将条目添加到Map中,并返回值,在本例中为“PRESENT”,如果Entry不存在,则返回null。
  4. 如果从Hashmap返回的值等于null,则Hashset的add方法返回true,否则返回false,这意味着条目已经存在…

换句话说:当你将一个键值对插入一个已经存在键的HashMap中时(在某种意义上,hashvalue()给出了相同的值,而equal()是真的,但是这两个对象在几个方面仍然可能有所不同),密钥不被replace,但值被覆盖。 密钥只是用来获取hashvalue(),并用它查找表中的值。 由于HashSet使用HashMap的键,并设置任意值(对用户来说)并不重要,所以Set的元素也不会被replace。