请考虑以下代码:
HashSet hs = new HashSet();
hs.add("hi"); -- (1)
hs.add("hi"); -- (2)
hs.size()
会给{1 HashSet
不允许重复,因此只会存储一个元素。
我想知道我们是否添加了重复元素,然后它是否替换了前一个元素,或者它根本就没有添加它?
此外,使用HashMap
对同一案件会发生什么?
答案 0 :(得分:213)
答案 1 :(得分:42)
您需要知道的第一件事是HashSet
就像Set
一样,这意味着您将对象直接添加到HashSet
,并且不能包含重复项。您只需在HashSet
中直接添加您的值即可。
但是,HashMap
是Map
类型。这意味着每次添加条目时,都会添加一个键值对。
在HashMap
中,您可以拥有重复值,但不能重复键。在HashMap
中,新条目将替换旧条目。最近的条目将在HashMap
。
了解HashMap和HashSet之间的链接:
请记住,HashMap
不能有重复的密钥。在幕后HashSet
使用HashMap
。
当您尝试将任何对象添加到HashSet
时,此条目实际上存储为HashMap
中的密钥 - 与{{{}}场景后面使用的HashMap
相同1}}。由于此基础HashSet
需要键值对,因此会为我们生成虚拟值。
现在,当您尝试将另一个重复对象插入同一个HashMap
时,它将再次尝试将其作为键插入位于下方的HashSet
中。但是,HashMap
不支持重复项。因此,HashMap
仍将导致只有该类型的一个值。作为旁注,对于每个重复键,由于为HashSet中的条目生成的值是一些随机/虚拟值,因此根本不替换该键。它将被忽略,因为删除密钥并添加相同的密钥(虚拟值相同)根本没有任何意义。
<强>要点:强>
HashSet
允许重复HashMap
,但不允许values
。
keys
不能包含重复项。
要了解是否成功完成了对象的添加,您可以检查调用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备份
答案 6 :(得分:0)
换句话说:当你将一个键值对插入到已存在键的HashMap中时(在某种意义上,hashvalue()给出相同的值而und equal()为true,但这两个对象仍然可以不同在几个方面),密钥不会被替换,但值被覆盖。该密钥仅用于获取hashvalue()并使用它在表中查找值。 由于HashSet使用HashMap的键并设置任意值(对用户而言)并不重要,因此Set的元素也不会被替换。
答案 7 :(得分:0)
HashMap
基本上包含Entry
,后面包含Key(Object)
和Value(Object)
。内部HashSet
HashMap
和HashMap
取代像你们中的一些人已经指出的那样的价值。但它真的取代了钥匙吗?不......这就是诀窍。 HashMap
将其值保留为底层HashMap
中的键,值只是一个虚拟对象。如果你尝试在HashMap中重新插入相同的值(基础Map中的键)。它只是替换虚拟值和而不是Key(HashSet的值)。
请查看以下HashSet类代码:
public boolean [More ...] add(E e) {
return map.put(e, PRESENT)==null;
}
这里e是HashSet的值,但是底层map的键。永远不会替换key。希望我能够清除这种混乱。