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

Ana*_*and 128 java hashmap duplicates hashset

请考虑以下代码:

HashSet hs = new HashSet();
hs.add("hi"); -- (1)
hs.add("hi"); -- (2)
Run Code Online (Sandbox Code Playgroud)

hs.size()将给出1,因为HashSet不允许重复,因此只存储一个元素.

我想知道我们是否添加了重复元素,然后它是否替换了前一个元素,或者它只是不添加它?

此外,HashMap在同一案件中使用会发生什么?

Kep*_*pil 226

在这种情况下HashMap,它将旧值替换为新值.

在这种情况下HashSet,未插入项目.

  • @mystarrocks:关键是`Set`的元素,它永远不会被`put()`操作所取代. (8认同)
  • 只是好奇,为什么 HashMap 和 HashSet 选择如此? (2认同)

Jim*_*mmy 46

你需要知道的第一件事是HashSet像a一样的行为Set,这意味着你直接将对象添加到它HashSet,它不能包含重复项.您只需直接添加您的值HashSet.

但是,HashMap是一种Map类型.这意味着每次添加条目时,都会添加键值对.

HashMap你可以有重复的值,但不能重复键.在HashMap新条目中将取代旧条目.最近的参赛作品将在HashMap.

理解HashMap和HashSet之间的链接:

请记住,HashMap不能有重复的密钥.在幕后HashSet使用了一个HashMap.

当您尝试将任何对象添加到a中时HashSet,此条目实际上存储为一个键HashMap- 与HashMap场景后面使用的相同HashSet.由于此底层HashMap需要键值对,因此为我们生成虚拟值.

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

摘要:

HashMap允许重复values,但不允许keys. HashSet不能包含重复项.

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


pb2*_*b2q 19

文档是对这个很清楚:HashSet.add 更换:

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

取代:HashMap.put

如果映射先前包含键的映射,则替换旧值.