Java中的哈希集是如何工作的?
可能重复:Java中的哈希集是如何工作的?,java,hashset,Java,Hashset,可能重复: 有人能给我解释一下java中的HashSet是如何工作的,以及为什么它们比使用ArrayList更快吗?AHashSet实际上是一个值始终相同的HashMap 许多地方都描述了HashMap的工作方式(它也被称为“hashtable”)。简而言之:它生成键(对象)的散列并将它们定位到表中。然后,每次查找键时,都会计算其哈希值,并直接引用表中的bucket。这意味着您只有一个操作(最佳情况)来访问地图 HashSet只包含键,因此.contains(..)是O(1)。和remove(
有人能给我解释一下java中的HashSet是如何工作的,以及为什么它们比使用ArrayList更快吗?A
HashSet
实际上是一个值始终相同的HashMap
许多地方都描述了HashMap
的工作方式(它也被称为“hashtable”)。简而言之:它生成键(对象)的散列并将它们定位到表中。然后,每次查找键时,都会计算其哈希值,并直接引用表中的bucket。这意味着您只有一个操作(最佳情况)来访问地图
HashSet
只包含键,因此.contains(..)
是O(1)
。和remove(…)
是HashSet
比ArrayList
更快的唯一操作(即O(n))。迭代是一样的,添加也是一样的。首先,HashSet
,与ArrayList
不同的是,它不能包含重复项,而ArrayList
可以-因此它们是为不同的目的而构建的。它也不能保证排序——同样,与列表不同
第二,数据结构上构建了一个HashSet
,它允许元素的O(1)
seek时间
请注意,很多时候,
HashSet
比ArrayList
更慢——例如,如果您想迭代元素,通常在ArrayList
中进行迭代会比在HashSet
中更快【因为hash的缓存性能差,以及其他原因】事实上,例如,迭代并附加到ArrayList会更快
而且,你甚至不能对哈希集进行排序
但是最快的是NoOp。没有什么能比NoOp快得多。当然,这没什么用,NoOp。但这真的很快
你需要在你认为比“快”的东西更精确。 < P>这是2种不同的数据结构。
HashSet
背后的概念是关键探测。也就是说,使用输入键的转换来获取数组中值位置的索引。
这是一个常量
O(1)
操作,因为数组允许随机访问
arraylist也是用于访问的O(1)
操作,因为它也由数组支持。
但仅用于随机访问和插入
搜索虽然是对arraylist的
O(N)
操作,因为您必须搜索列表中的所有元素才能获得值,而不像哈希集
那样,您只需变换键并访问数组。在HashSet
中搜索是O(1)
它是否更快完全取决于您使用它的目的。例如,HashMap永远无法比ArrayList更快地按索引查找内容。对集合的操作可以更快,但这取决于您如何添加内容。选择一本关于数据结构和算法的好书,如《算法简介》,阅读有关哈希表的内容。哈希集和ArrayList是两种完全不同的东西。Java有一种称为。这是的文档,这是的文档。阅读是基础。为了增加描述性答案,迭代应该是O(n),加法应该是O(1)时间复杂度,就像HashMap一样。检查的一个好概念是重新散列,在数据结构中存储更多的数据(使用加载因子检查),因此必须为相同的数据创建更大的表,从而增加平均插入时间。