【发布时间】:2018-05-29 19:49:57
【问题描述】:
我正在学习 Java 中的 Java 集合框架,并且对各种类和接口有了一定的了解。
通过Set 接口时,其中一种实现是HashSet(以及其他)。
我不明白在Hash的基础上实现Set的逻辑是什么,它有什么好处?
谁能帮我理解在 Java 集合框架中基于哈希实现 Set 的需求是什么?
【问题讨论】:
-
这速度很快。哪个集合做的最多的操作是
contains,它需要检查集合是否已经有元素等于我们要添加的元素。让 set 根据哈希值将元素组织在组中,这样就无需检查具有与我们正在测试的元素不同的哈希值的组。所以这样的集合不需要遍历所有元素,而只需要那些具有相似哈希码的元素。 -
@Pshemo:但我们也知道两个不同的元素可能导致相同的哈希值;那么如何确保这种唯一性呢?我们在哪里可以获得更多信息?
-
对于 HashSet 中的每个键,都会维护一个项目列表。如果您遇到哈希冲突,则两个项目都将添加到列表中。然后使用该项目上的 equals() 方法来确定您想要哪一个。 stackoverflow.com/questions/12909325/hashset-collisions-in-java
-
我在之前的评论中添加了说明。简而言之,当调用
set.add(x)set getx.hashcode()时,它现在知道它应该迭代哪一组元素,以寻找相等的元素。它可以跳过来自其他组的迭代元素,因为它已经知道它们具有不同的哈希值,因此它们不能等于x元素。因此,如果我们有 4 个相同填充的组,那么它会加快处理速度 4 倍,因为它需要迭代最多 1/4 个元素。如果我们有 256 个相同填充的组,那么性能也会提高约 256 倍(与迭代所有元素相比)。