请考虑以下代码:
HashSet hs = new HashSet();
hs.add("hi"); -- (1)
hs.add("hi"); -- (2)
hs.size()
将给出 1,因为 HashSet
不允许重复,因此只会存储一个元素。
我想知道我们是否添加了重复元素,然后它会替换前一个元素还是根本不添加它?
另外,对于同样的情况,使用 HashMap
会发生什么?
原文由 Anand 发布,翻译遵循 CC BY-SA 4.0 许可协议
请考虑以下代码:
HashSet hs = new HashSet();
hs.add("hi"); -- (1)
hs.add("hi"); -- (2)
hs.size()
将给出 1,因为 HashSet
不允许重复,因此只会存储一个元素。
我想知道我们是否添加了重复元素,然后它会替换前一个元素还是根本不添加它?
另外,对于同样的情况,使用 HashMap
会发生什么?
原文由 Anand 发布,翻译遵循 CC BY-SA 4.0 许可协议
您需要知道的第一件事是 HashSet
就像 Set
一样,这意味着您将对象直接添加到 HashSet
包含 cannot duplicate-f81.您只需直接在 HashSet
中添加您的值。
然而, HashMap
是一个 Map
类型。这意味着每次添加条目时,都会添加一个键值对。
在 HashMap
你可以有重复的值,但不能有重复的键。在 HashMap
中,新条目将替换旧条目。最近的条目将在 HashMap
中。
了解 HashMap 和 HashSet 之间的联系:
请记住, HashMap
不能有重复的键。在幕后 HashSet
使用 HashMap
。
当您尝试将任何对象添加到 HashSet
时,此条目实际上存储为 HashMap
中的键 - 与幕后使用的 —5926b8bc82e851415484dfb20aa- HashMap
的 HashSet
。由于这个底层 HashMap
需要一个键值对,所以为我们生成了一个虚拟值。
现在,当您尝试将另一个重复对象插入同一个 HashSet
时,它会再次尝试将其作为键插入到位于下方的 HashMap
中。但是, HashMap
不支持重复。因此, HashSet
仍将导致只有一个该类型的值。作为旁注,对于每个重复键,由于为我们在 HashSet 中的条目生成的值是一些随机/虚拟值,因此键根本不会被替换。它将被忽略,因为删除密钥并添加回相同的密钥(虚拟值相同)根本没有任何意义。
概括:
HashMap
允许重复 values
,但不允许 keys
。 HashSet
不能包含重复项。
要玩对象的添加是否成功完成,你可以检查 boolean
调用时返回的值 .add()
看看它是否返回 true
或 false
。如果它返回 true
,则它已被插入。
原文由 Jimmy 发布,翻译遵循 CC BY-SA 3.0 许可协议
8 回答6.5k 阅读
4 回答704 阅读✓ 已解决
2 回答3.4k 阅读
3 回答1.9k 阅读✓ 已解决
1 回答2.2k 阅读✓ 已解决
1 回答2.1k 阅读✓ 已解决
1 回答1.5k 阅读✓ 已解决
在
HashMap
的情况下,它将旧值替换为新值。在
HashSet
的情况下,不会插入项目。