向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
是一个Map
types。 这意味着每次添加条目时,都要添加一个键值对。
在HashMap
你可以有重复的值,但不能重复键值。 在HashMap
,新条目将replace旧条目。 最近的条目将在HashMap
。
了解HashMap和HashSet之间的链接:
请记住, HashMap
不能有重复的键。 场景后面HashSet
使用一个HashMap
。
当你试图将任何对象添加到HashSet
,这个条目实际上被存储在HashMap
一个键 – 与HashSet
的场景背后使用的相同的HashMap
。 由于这个底层HashMap
需要一个键值对,所以我们会生成一个虚拟值。
现在当你试图插入另一个重复的对象到同一个HashSet
,它会再次试图将它作为一个键插入到下面的HashMap
。 但是, HashMap
不支持重复。 因此, HashSet
仍然会导致只有一个该types的值。 作为一个方面说明,对于每个重复的键,因为我们在HashSet中input的值是一些随机/虚拟值,所以密钥根本不被replace。 它会被忽略,因为删除键和添加相同的键(虚拟值是相同的)根本没有任何意义。
概要:
HashMap
允许重复的values
,但不是keys
。 HashSet
不能包含重复项。
要玩对象的添加是否成功完成,您可以检查在调用.add()
时返回的boolean
值,看它是否返回true
或false
。 如果它返回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备份的
- 当你添加重复的值说一个string“一”到HashSet,
- 一个条目(“一个”,PRESENT)将被插入到Hashmap中(对于添加到集合中的所有值,值将是“PRESENT”,如果types为Object)
- Hashmap将条目添加到Map中,并返回值,在本例中为“PRESENT”,如果Entry不存在,则返回null。
- 如果从Hashmap返回的值等于null,则Hashset的add方法返回true,否则返回false,这意味着条目已经存在…
换句话说:当你将一个键值对插入一个已经存在键的HashMap中时(在某种意义上,hashvalue()给出了相同的值,而equal()是真的,但是这两个对象在几个方面仍然可能有所不同),密钥不被replace,但值被覆盖。 密钥只是用来获取hashvalue(),并用它查找表中的值。 由于HashSet使用HashMap的键,并设置任意值(对用户来说)并不重要,所以Set的元素也不会被replace。