【问题标题】:Hash based implementation of Set in Java Collection Framework?Java集合框架中基于哈希的Set实现?
【发布时间】: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 get x.hashcode() 时,它现在知道它应该迭代哪一组元素,以寻找相等的元素。它可以跳过来自其他组的迭代元素,因为它已经知道它们具有不同的哈希值,因此它们不能等于 x 元素。因此,如果我们有 4 个相同填充的组,那么它会加快处理速度 4 倍,因为它需要迭代最多 1/4 个元素。如果我们有 256 个相同填充的组,那么性能也会提高约 256 倍(与迭代所有元素相比)。

标签: java hash hashmap hashset


【解决方案1】:

简单:性能和效率。

Sets 的关键要素是:唯一性。您希望快速能够判断某个 x 是否在 (x, y, z) 中。

而散列是解决这个问题的一种非常优雅和有效的方法。

这就是全部。

【讨论】:

  • 感谢您的回答和分享您的知识。
猜你喜欢
  • 2018-05-30
  • 2012-03-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-14
  • 2013-05-31
相关资源
最近更新 更多