在Java中过滤列表,同时避免o(n)复杂性中的ConcurrentModificationException

在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

我发现迭代器.remove()的复杂性为o(n)。任何人都知道一种在不使用迭代器的情况下过滤列表,同时避免ConcurrentModificationException的方法

下面是一段代码片段,显示了两者的区别。它创建一个大数组列表,然后使用它从中间删除其中的大部分。remove()。 然后它从一开始就做同样的事情。我的机器上写着: 第一次测试699962ms 第二次测试329181ms

显然有很大的不同

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似乎问题仍然存在。