在Java中过滤列表,同时避免o(n)复杂性中的ConcurrentModificationException
我发现迭代器.remove()的复杂性为o(n)。任何人都知道一种在不使用迭代器的情况下过滤列表,同时避免ConcurrentModificationException的方法 下面是一段代码片段,显示了两者的区别。它创建一个大数组列表,然后使用它从中间删除其中的大部分。remove()。 然后它从一开始就做同样的事情。我的机器上写着: 第一次测试699962ms 第二次测试329181ms 显然有很大的不同在Java中过滤列表,同时避免o(n)复杂性中的ConcurrentModificationException,java,iterator,time-complexity,concurrentmodification,Java,Iterator,Time Complexity,Concurrentmodification,我发现迭代器.remove()的复杂性为o(n)。任何人都知道一种在不使用迭代器的情况下过滤列表,同时避免ConcurrentModificationException的方法 下面是一段代码片段,显示了两者的区别。它创建一个大数组列表,然后使用它从中间删除其中的大部分。remove()。 然后它从一开始就做同样的事情。我的机器上写着: 第一次测试699962ms 第二次测试329181ms 显然有很大的不同 package src; import java.util.*; import jav
package src;
import java.util.*;
import java.lang.*;
class Main {
public static void main(String[] args) {
ArrayList<Integer> a = new ArrayList<Integer>();
long before, after;
double elements = Math.pow(10, 3);
for(int i = 0; i < elements; i++) {
a.add(i);
}
Iterator<Integer> it = a.iterator();
for(int i = 0; i < elements * 0.4; i++){
it.next();
}
before = System.nanoTime();
for(int i = 0; i < elements * 0.5; i++){
it.remove();
it.next();
}
after = System.nanoTime();
System.out.println(after - before);
a = new ArrayList<Integer>();
for(int i = 0; i < elements; i++) {
a.add(i);
}
before = System.nanoTime();
it = a.iterator();
it.next();
for(int i = 0; i < elements * 0.5; i++){
it.remove();
it.next();
}
after = System.nanoTime();
System.out.println(after - before);
}
}
包src;
导入java.util.*;
导入java.lang.*;
班长{
公共静态void main(字符串[]args){
ArrayList a=新的ArrayList();
很久以前,很久以后;
双元素=数学功率(10,3);
for(int i=0;i
根据通知,您的基准测试不正确。考虑到使用remove()
或Iterator.remove()
从ArrayList
中进行的单个删除是一个O(n)
操作(除非删除最后一个元素),由于内部数组的大小调整,代码在任何情况下都无法正常运行
LinkedList
将在迭代时为您提供一个O(1)
删除,但您应该选择最简单的解决方案,并使用List.removeIf()
ArrayList
为O(n)
性能覆盖它,并避免CME
。使用LinkedList试试。此外,您的测试离正确的基准测试还差得很远,因此您认为您从中得到的任何时间或性能比较都是错误的。时间复杂性与迭代器无关,与您使用的列表类型有关。此外,您应该只使用list.removeIf()
。也许这不是一个合适的束标记,但迭代器.remove()仍然具有o(n)复杂性。在使用LinkedList进行测试后,我得到了以下结果:41233088829似乎问题仍然存在。