ArrayList.size上的Java ConcurrentModificationException

时间:2017-01-09 15:58:02

标签: java arraylist concurrentmodification

我正在尝试在java中实现合并排序,但这会在行while(ai<la.size()&&bi<lb.size()){中导致ConcurrentModificationException。我在Stack上看到了很多关于这个问题的答案,但它们都与从列表中删除项目有关,但我并没有这样做。导致此异常的原因是什么,以及如何解决此问题?

public static <Elem extends Comparable<Elem>> void mergesort(List<Elem> list) {
    if(list.size()>1){
        int hf = list.size()/2;
        List<Elem> la = list.subList(0, hf-1);
        List<Elem> lb = list.subList(hf, list.size()-1);
        mergesort(la);
        mergesort(lb);
        int ai=0;
        int bi=0;
        int oi=0;
        while(ai<la.size()&&bi<lb.size()){
            if(la.get(ai).compareTo(lb.get(bi))>0){
                list.add(oi, la.get(ai));
                ai++;
            }
            else{
                list.add(oi, lb.get(bi));
                bi++;
            }
            oi++;
        }
        while(ai<la.size()){
            list.add(oi, la.get(ai));
            ai++;
            oi++;
        }
        while(bi<lb.size()){
            list.add(oi, lb.get(bi));
            bi++;
            oi++;
        }
    }
}

但是使用mergesort(Arrays.asList(3, 2, 1, 6, 5, 4))进行测试会导致以下错误:

  

java.util.ConcurrentModificationException
  at java.util.ArrayList $ SubList.checkForComodification(ArrayList.java:1231)
  at java.util.ArrayList $ SubList.size(ArrayList.java:1040)
  at week04.MergeSort.mergesort(MergeSort.java:17)
  at week04.test.MergeSortTest.testMergesortUnsortedList(MergeSortTest.java:42)

0 个答案:

没有答案