Java为什么HashSet的remove()需要O(1)时间,当ArrayList的remove()需要O(n)?

时间:2017-12-03 16:21:15

标签: java runtime

我发现Java的HashSet的remove(Object o)需要O(1)常量时间,而ArrayList的remove(Object o)操作需要O(N),其中N是ArrayList的大小

有人可以详细解释一下为什么会这样吗?

2 个答案:

答案 0 :(得分:2)

HashSet' remove()需要O(1)个预定时间才能找到要删除的元素 - hashCode()会将您带到包含该元素的bin中,并且每个bin应该具有少量条目,因此在bin中找到元素并将其删除应该花费一些时间。

另一方面,在ArrayList中,您必须迭代所有元素,直到找到要删除的元素 - 这需要O(n)。即使在找到元素之后,删除本身也会涉及移动索引比删除元素更高的所有元素 - 这也需要O(n)

答案 1 :(得分:0)

ArrayList: -

Java中的ArrayList是一个由数组支持的List。

在操作中移除(i)arraylist移除列表中指定位置的元素,将任何后续元素移到左侧。

因此,在最坏的情况下,如果删除第一个元素,则需要将剩余的n-1个元素向左移动。因此,复杂性是o(n)。

<强> HashSet的: -

Java内部使用hashmap来存储set的元素。 hashset的元素是hashmap中的关键,值是一些虚拟对象。

hashmap中的remove操作如下: -

  1. 找到密钥的哈希值。
  2. 在条目表中找到密钥的索引。
  3. 在桶上迭代找到钥匙。
  4. 从存储桶链接列表中删除密钥。
  5. 在最坏的情况下,存储桶可以包含所有密钥,复杂性似乎是o(n)。但在现实生活中,任何可靠的哈希映射实现,加上一半体面的哈希函数,在预期的情况下具有非常小的因子(实际上是2)的O(1)的检索性能,在非常窄的方差范围内