Java 中的 HashSet 是如何工作的? [复制]

Posted

技术标签:

【中文标题】Java 中的 HashSet 是如何工作的? [复制]【英文标题】:How do HashSets in Java work? [duplicate] 【发布时间】:2012-02-25 13:13:12 【问题描述】:

可能重复:How does Java hashmap work?

有人可以向我解释一下 Java 中的 HashSet 是如何工作的,以及为什么它们比使用 ArrayList 更快吗?

【问题讨论】:

它是否更快完全取决于您使用它的目的。例如,HashMap 永远无法比 ArrayList 更快地按索引查找内容。 可以更快更快地处理集合,但这也取决于您添加内容的方式。 拿起一本关于数据结构和算法的好书,例如算法简介,并阅读有关哈希表的知识。 docs.oracle.com/javase/tutorial/collections HashSet 和 ArrayList 是两个完全不同的东西。 Java 有一个名为 The API Reference 的文档类型。这是HashSet 的文档,这是ArrayList 的文档。阅读是基础。 【参考方案1】:

首先,HashSetArrayList 不同的是 Set:它不能包含重复项,而 ArrayList 可以 - 因此它们是为不同目的而构建的。它也不保证排序 - 再次与列表不同。

第二个 - HashSet 建立在 hash table 数据结构之上,它允许 O(1) 寻找元素的时间。

请注意,很多时候,HashSet较慢然后是 ArrayList - 例如,如果您想 迭代 元素 - 通常在 @ 987654330@ 会比HashSet 更快[因为哈希缓存性能不佳等原因]

【讨论】:

【参考方案2】:

HashSet 实际上是 HashMap,其中值始终相同。

HashMap 的工作方式在很多地方都有描述(它也被称为“哈希表”)。简而言之:它生成键(对象)的散列并将它们定位到表中。然后每次查找键时,都会计算其哈希值并直接引用表中的存储桶。这意味着您只需一项操作(最佳情况)即可访问地图。

HashSet 只包含键,所以.contains(..)O(1)。那和remove(..) 是唯一一个HashSetArrayList 快的操作(即O(n))。迭代一样,加法一样。

【讨论】:

只是为了添加描述性答案,迭代应该是 O(n),加法应该是 O(1) 时间复杂度,就像 HashMap 一样。一个很好的检查概念是重新散列,其中更多数据将存储在数据结构中(使用负载因子检查),因此必须为此创建更大的表,从而导致平均插入时间增加。【参考方案3】:

这是两种不同的数据结构。

HashSet 背后的概念是密钥探测。 IE。您使用输入键的转换来获取数组中值位置的索引。 这是一个常量O(1) 操作,因为数组允许随机访问。

arraylist 也是O(1) 访问操作,因为它也由数组支持。 但仅用于随机访问和插入。

search 是数组列表的 O(N) 操作,因为您必须搜索列表中的所有元素才能获得该值,这与 HashSet 不同,您只需转换键和访问数组。在HashSet 中搜索是O(1)

【讨论】:

【参考方案4】:

事实上,例如 迭代追加 到 ArrayList 更快。

哎呀,你甚至不能排序一个HashSet。

但最快的是 NoOp。没有什么比 NoOp 快。诚然,NoOp 并没有多大作用。但它真的很快!

您需要更精确地说明您认为“比”更快的内容。

【讨论】:

以上是关于Java 中的 HashSet 是如何工作的? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

Java学习---HashMap和HashSet的内部工作机制

java:Set对象TreeSet有序子类,HashSet无序子类,重复对象二

私有最终 HashSet 是如何工作的? [复制]

Java HashSet工作原理及实现

C++ 中的 Java HashSet 等价物

Java基础篇 如何使用HashSet