有人可以向我解释一下java中的HashSets如何工作以及为什么它们比使用ArrayLists更快?
答案 0 :(得分:19)
HashSet
实际上是HashMap
,其值始终相同。
HashMap
的工作方式在很多地方都有描述(它也被称为“哈希表”)。简而言之:它生成键(对象)的哈希值并将它们放入表中。然后,每次查找密钥时,都会计算其哈希值,并直接引用表中的桶。这意味着您只需一个操作(最佳情况)即可访问地图。
HashSet
只包含密钥,因此.contains(..)
为O(1)
。那个和remove(..)
是HashSet
比ArrayList
(即O(n))更快的唯一操作。迭代是一样的,加法是一样的。
答案 1 :(得分:14)
首先,与HashSet
不同,ArrayList
是Set:ArrayList
可以不包含重复项 - 因此它们是为不同目的而构建的。它也不保证订购 - 再次,不像列表。
第二 - HashSet
建立在hash table数据结构上,允许O(1)
为元素寻找时间。
请注意,很多时候,HashSet
较慢然后是ArrayList
- 例如,如果您想对元素进行迭代 - 通常会这样做ArrayList
中的它会比HashSet
更快[因为哈希的缓存性能不佳等原因]
答案 2 :(得分:1)
这是两种不同的数据结构。
HashSet
背后的概念是关键的探索
即您使用输入键的转换来获取数组中值的位置索引
这是一个常量O(1)
操作,因为数组允许随机访问。
arraylist也是O(1)
访问操作,因为它也由数组支持。
但仅限随机访问和插入。
搜索虽然是一个arraylist的O(N)
操作,因为您必须搜索列表中的所有元素以获取值,而不是HashSet
您所在的位置转换密钥并访问数组。在HashSet
中搜索O(1)
答案 3 :(得分:0)
事实上,例如迭代并且将附加到ArrayList更快。
哎呀,你甚至不能排序一个HashSet。
但最快的是NoOp。没有任何东西像NoOp一样快。当然,它没有做太多,NoOp。但它真的很快!
你需要更精确地考虑“比”更快。