只是想知道HashSet.equals(anotherHashSet)
是否在恒定时间内运行(也以ConcurrentHashSet
作为参数),我认为这样做是出于效率原因。看不到任何提到它的东西,我正在构建的框架的一部分依赖于功能(不希望它花费太长时间!)。
编辑:抱歉,意识到HashSet.equals()无法在恒定时间内运行,因为元素可以更改,而地图中元素的哈希码保持不变。因此,解决此问题的最佳方法是使用哈希码。虽然代码味道不好吗?
答案 0 :(得分:7)
查看典型的implementation表明它containsAll
。对包含的每个检查都将是O(1),并且必须进行N个,所以我认为O(N)。
答案 1 :(得分:4)
据我从代码中看到 - 它以线性时间运行。迭代该集合并比较每个元素:
equals(..
中的AbstractSet
调用containsAll(..)
中的AbstractCollection
,它获取迭代器并为每个元素调用contains(..)
,然后调用map.containsKey(..)
1}}这是O(1)
。所以O(n)
如果我没有弄错的话。
答案 2 :(得分:4)
由于equals()
contract of a Set
要求两个Set
对象的元素必须相同,我不认为在一般情况下可以在O(1)中正确实现它(即例如,没有对内容类型的额外限制。
一个明显的例外是,如果incomming集具有不同的大小,那么equals()
操作可以很容易地在O(1)中完成(只要size()
本身是O(1))。
您可以编写一个瘦包装器,在每次计算时缓存hashCode()
(并在Set
更改时丢弃它)。这将允许您在大多数情况下具有恒定的运行时间,其中两个Set
对象不相同。当你必须等于Set
个对象时(或者在哈希冲突的情况下),你仍然会有一个O(n)运行时。
答案 3 :(得分:2)
怎么可能在恒定的时间内运行?唯一明智的实现(也就是使用的那个,你可以看到,如果你检查API文档)是迭代其中一个集合,并为每个元素检查另一个元素是否包含它,这基本上是一个O(n + m)操作。