Java ArrayList vs HashSet中的removeAll()

Java ArrayList vs HashSet中的removeAll(),java,arraylist,hashset,removeall,Java,Arraylist,Hashset,Removeall,我发现对于相当大的数组(超过1000个条目),方法A.removeAll(B)在HashSet上比在ArrayList上快得多 你知道这些方法是如何实现的吗?这是如何解释这种差异的?一个集合(因此也包括HashSet)最多包含B的一个元素,并且由于HashSet使用哈希,因此定位和删除该元素是非常有效的。因此,删除所有(即一个)B的总体复杂性应为O(1) 列表可以在任何位置包含任意数量的B,因此删除所有B必须检查所有元素。总体复杂性为O(n),因为必须检查每个元素是否为B 编辑: 如果B表示集合

我发现对于相当大的数组(超过1000个条目),方法
A.removeAll(B)
HashSet
上比在
ArrayList
上快得多

你知道这些方法是如何实现的吗?这是如何解释这种差异的?

一个集合(因此也包括
HashSet
)最多包含
B
的一个元素,并且由于
HashSet
使用哈希,因此定位和删除该元素是非常有效的。因此,删除所有(即一个)
B
的总体复杂性应为
O(1)

列表可以在任何位置包含任意数量的
B
,因此删除所有
B
必须检查所有元素。总体复杂性为
O(n)
,因为必须检查每个元素是否为
B

编辑:

如果
B
表示集合/数组,即一组多个元素,则将上述复杂性乘以
B
,因此您将得到
O(m)
for
HashSet
O(n*m)
用于列表

编辑2:

请注意,如果您有一个排序列表,那么复杂性可能会降低到
O(log(n))
O(log(n)*m)
。为了实现这一点,删除实际元素的代码必须知道列表是经过排序的,而且由于
ArrayList
不能保证排序,因此无法进行优化。

一个集合(以及
HashSet
)最多包含
B
的一个元素,由于
HashSet
使用哈希,因此查找和删除该元素非常有效。因此,删除所有(即一个)
B
的总体复杂性应为
O(1)

列表可以在任何位置包含任意数量的
B
,因此删除所有
B
必须检查所有元素。总体复杂性为
O(n)
,因为必须检查每个元素是否为
B

编辑:

如果
B
表示一个集合/数组,即一组多个元素,则将上述复杂度乘以
B
m
,因此对于
HashSet
将得到
O(m)
,对于列表将得到
O(n*m)

编辑2:


请注意,如果您有一个排序列表,那么复杂性可能会降低到
O(log(n))
O(log(n)*m)
。为了实现这一点,删除实际元素的代码必须知道列表是经过排序的,而且由于不能保证排序,因此无法进行优化。

基本上,这两种方法的原因都是这些特定实现试图为各自的操作实现的时间复杂性

ArrayList
remove方法的时间复杂度是
O(n-index)


虽然
散列集的remove方法提供了恒定的时间复杂度
O(1)
基本上,这两种方法的原因都是这些特定实现试图为各自的操作实现的时间复杂度

ArrayList
remove方法的时间复杂度是
O(n-index)


散列集的remove方法提供恒定的时间复杂度
O(1)

时,你的意思是
数组列表中的复杂度大约是O(n2)?@Arcyno从哪里得到
O(n2)
(如
O(n*n)
?如果你的意思是
B
是一个集合或数组,请参见我的编辑。没有“数组列表中的复杂性”
ArrayList
s上的特定操作具有特定的时间复杂性。
ArrayList
删除的时间复杂度通常被认为是O(N)。那么您的意思是
ArrayList
中的复杂度大约是O(n2)?@Arcyno从哪里得到
O(n2)
(如
O(N*N)
?如果你的意思是
B
是一个集合或数组,请参见我的编辑。没有“数组列表中的复杂性”
ArrayList
s上的特定操作具有特定的时间复杂性。
ArrayList
删除的时间复杂度通常被认为是O(N)。