Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/395.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java中的哈希集是如何工作的?_Java_Hashset - Fatal编程技术网

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一样。检查的一个好概念是重新散列,在数据结构中存储更多的数据(使用加载因子检查),因此必须为相同的数据创建更大的表,从而增加平均插入时间。