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

问题

请考虑以下代码:

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是aMaptype。这意味着每次添加条目时,都会添加键值对。

InHashMap你可以拥有重复值,但不能重复键。在5444797645中,新条目将取代旧条目。最近的参赛作品将在HashMap
了解HashMap和HashSet之间的链接:
请记住,HashMap没有重复的密钥。场景背后HashSet使用aHashMap

当你尝试将任何对象添加到aHashSet中时,此条目实际上存储为HashMap中的密钥 - 在38821998场景后面使用的相同的HashMap。由于这个底层HashMap需要一个键值对,因此我们会生成一个虚拟值。

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

要使用是否成功完成对象的添加,你可以检查调用.add()时返回的31465793值,并查看它是否返回truefalse。如果它返回true,则插入它。


#3 热门回答(13 赞)

Thedocs对此很清楚:HashSet.add不能替换:

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

ButHashMap.putwillreplace:

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