ArrayList与HashSet中的removeAll()

时间:2015-12-02 15:10:00

标签: java arraylist hashset removeall

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

您是否知道如何实施这些方法以及如何解释这些差异?

2 个答案:

答案 0 :(得分:7)

一个集合(因而protected void handleFire() { try { Desktop.getDesktop().open(getFile()); } catch (IOException | IllegalArgumentException | NullPointerException e) { logger.log(Level.SEVERE, String.format("Could not open file. %s", e.getMessage())); } } )最多包含HashSet的一个元素,并且由于B使用散列,因此定位和删除该元素非常有效。因此,总体复杂度应为HashSet,以便删除所有(即一个)O(1)

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

编辑:

如果B代表一个集合/数组,即一组多个元素,您可以将上述复杂度乘以B的{​​{1}}大小,这样您就可以{ {1}} mB列表。

编辑2:

请注意,如果您有排序列表,则复杂性可能会降低到O(m)HashSet。为了实现这一点,删除实际元素的代码必须知道列表已排序,因为O(n * m)不能保证排序,所以无法进行优化。

答案 1 :(得分:1)

基本上两者的原因是这些特定实现试图为其相应的操作实现的时间复杂性。

ArrayList删除方法的时间复杂度为O(n - index) source from When to use LinkedList over ArrayList?

虽然HashSet的移除方法提供了恒定的时间复杂度O(1) source from Hashset vs Treeset