问题
请考虑以下代码:
HashSet hs = new HashSet();
hs.add("hi"); -- (1)
hs.add("hi"); -- (2)
hs.size()
将给1 asHashSet
不允许重复,因此只存储一个元素。
我想知道我们是否添加了重复元素,然后它是否替换了前一个元素,或者它只是不添加它?
另外,对于同一案例,使用HashMap
会发生什么?
#1 热门回答(182 赞)
在66200200917的情况下,它将旧值替换为新值。
在688876519的情况下,未插入该项目。
#2 热门回答(38 赞)
你需要知道的第一件事是HashSet
就像aSet
,这意味着你将对象直接添加到HashSet
并且它不能包含重复项。你只需直接在2882878549中添加你的值。
但是,HashMap
是aMap
type。这意味着每次添加条目时,都会添加键值对。
InHashMap
你可以拥有重复值,但不能重复键。在5444797645中,新条目将取代旧条目。最近的参赛作品将在HashMap
。
了解HashMap和HashSet之间的链接:
请记住,HashMap
没有重复的密钥。场景背后HashSet
使用aHashMap
。
当你尝试将任何对象添加到aHashSet
中时,此条目实际上存储为HashMap
中的密钥 - 在38821998场景后面使用的相同的HashMap
。由于这个底层HashMap
需要一个键值对,因此我们会生成一个虚拟值。
现在,当你尝试将另一个重复对象插入到sameHashSet
中时,它将再次尝试将其作为键插入到下面的HashMap
中。但是,HashMap
不支持重复项。因此,HashSet
仍将导致只有该类型的一个值。作为旁注,对于每个重复键,由于为HashSet中的条目生成的值是一些随机/虚拟值,因此根本不替换该键。它将被忽略,因为删除密钥并添加相同的密钥(虚拟值相同)根本没有任何意义。
摘要:HashMap
允许duplicatevalues
,但不是4636369301.HashSet
不能包含重复项。
要使用是否成功完成对象的添加,你可以检查调用.add()
时返回的31465793值,并查看它是否返回true
或false
。如果它返回true
,则插入它。
#3 热门回答(13 赞)
Thedocs对此很清楚:HashSet.add
不能替换:
如果指定的元素尚不存在,则将其添加到此集合中。更正式地,如果此集合不包含元素e2(e == null?e2 == null:e.equals(e2)),则将指定元素e添加到此集合。如果此set已包含该元素,则调用将保持set不变并返回false。
ButHashMap.put
willreplace:
如果 Map 以前包含该键的映射,则替换旧值。