Java中的HashSets如何工作?

时间:2012-02-02 20:52:38

标签: java hashset

  

可能重复:
  How does Java hashmap work?

有人可以向我解释一下java中的HashSets如何工作以及为什么它们比使用ArrayLists更快?

4 个答案:

答案 0 :(得分:19)

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

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

HashSet只包含密钥,因此.contains(..)O(1)。那个和remove(..)HashSetArrayList(即O(n))更快的唯一操作。迭代是一样的,加法是一样的。

答案 1 :(得分:14)

首先,与HashSet不同,ArrayListSetArrayList可以不包含重复项 - 因此它们是为不同目的而构建的。它也不保证订购 - 再次,不像列表。

第二 - 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。但它真的很快!

你需要更精确地考虑“比”更快。