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

新手上路,请多包涵

请考虑以下代码:

 HashSet hs = new HashSet();
hs.add("hi"); -- (1)
hs.add("hi"); -- (2)

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

我想知道我们是否添加了重复元素,然后它会替换前一个元素还是根本不添加它?

另外,对于同样的情况,使用 HashMap 会发生什么?

原文由 Anand 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.6k
2 个回答

HashMap 的情况下,它将旧值替换为新值。

HashSet 的情况下,不会插入项目。

原文由 Keppil 发布,翻译遵循 CC BY-SA 3.0 许可协议

您需要知道的第一件事是 HashSet 就像 Set 一样,这意味着您将对象直接添加到 HashSet 包含 cannot duplicate-f81.您只需直接在 HashSet 中添加您的值。

然而, HashMap 是一个 Map 类型。这意味着每次添加条目时,都会添加一个键值对。

HashMap 你可以有重复的值,但不能有重复的键。在 HashMap 中,新条目将替换旧条目。最近的条目将在 HashMap 中。

了解 HashMap 和 HashSet 之间的联系:

请记住, HashMap 不能有重复的键。在幕后 HashSet 使用 HashMap

当您尝试将任何对象添加到 HashSet 时,此条目实际上存储为 HashMap 中的键 - 与幕后使用的 —5926b8bc82e851415484dfb20aa- HashMapHashSet 。由于这个底层 HashMap 需要一个键值对,所以为我们生成了一个虚拟值。

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

概括:

HashMap 允许重复 values ,但不允许 keysHashSet 不能包含重复项。

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

原文由 Jimmy 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题