并发修改例外

时间:2016-07-16 18:39:57

标签: java arraylist

如何解决以下程序中的ConcurrentModificationException。 我需要一个列表,其中第一个元素是"Znk",然后是列在其后面的排序。

我理解,我得到的是因为我在同一次迭代中添加和删除。但是我如何解决这个问题并获得所需的输出。

public class ListSwapIndex {

    public static void main(String[] args) {
        // TODO Auto-generated method stub

        ArrayList<String> swapIndex = new ArrayList<String>();
        ArrayList<String> swapIndextemp = new ArrayList<String>();
        swapIndex.add("Ank");
        swapIndex.add("Znk");
        swapIndex.add("Bnk");
        swapIndex.add("Dnk");
        swapIndex.add("Enk");
        swapIndex.add("Lnk");

        for (String string : swapIndex) {
            if(string.equals("Znk")){
                swapIndextemp.add(string);
                swapIndex.remove(string);
                }           
        }
        swapIndextemp.addAll(swapIndex);
        System.out.println(swapIndextemp);

    }

}

1 个答案:

答案 0 :(得分:4)

不允许您在迭代时同时修改集合。 Java通过检查正在迭代的集合来保护这一点,并在发现修改时快速失败。

使用ListIterator<T>而不是使用for进行迭代 - 每个循环都可以解决问题,因为ArrayList的列表迭代器允许删除:

for (ListIterator<String> iter=swapIndex.listIterator(); iter.hasNext() ; ) {
    String current = iter.next();
    if(current.equals("Znk")){
        swapIndextemp.add(string);
        iter.remove();
    }
}

但请注意,此方法不是最理想的,因为从数组列表中删除是O(n)操作,从而导致O(n 2 )整体性能。你最好两次迭代列表 - 一次将所有"Znk"放在前面,然后再将其余项放在后面。这使您的整体表现为O(n)。