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首先,HashSet
与 ArrayList
不同的是 Set:它不能包含重复项,而 ArrayList
可以 - 因此它们是为不同目的而构建的。它也不保证排序 - 再次与列表不同。
第二个 - HashSet
建立在 hash table 数据结构之上,它允许 O(1)
寻找元素的时间。
请注意,很多时候,HashSet
较慢然后是 ArrayList
- 例如,如果您想 迭代 元素 - 通常在 @ 987654330@ 会比HashSet
更快[因为哈希缓存性能不佳等原因]
【讨论】:
【参考方案2】:HashSet
实际上是 HashMap
,其中值始终相同。
HashMap
的工作方式在很多地方都有描述(它也被称为“哈希表”)。简而言之:它生成键(对象)的散列并将它们定位到表中。然后每次查找键时,都会计算其哈希值并直接引用表中的存储桶。这意味着您只需一项操作(最佳情况)即可访问地图。
HashSet
只包含键,所以.contains(..)
是O(1)
。那和remove(..)
是唯一一个HashSet
比ArrayList
快的操作(即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的内部工作机制