Java 并发修改异常

Java 并发修改异常,java,arraylist,Java,Arraylist,如何从下面的程序中解决ConcurrentModificationException。 我需要一个列表,其中第一个元素是“Znk”,然后是排序后的列表 我明白,我得到这个是因为我在同一个迭代中添加和删除。但是我如何解决这个问题并获得所需的输出呢 public class ListSwapIndex { public static void main(String[] args) { // TODO Auto-generated method stub

如何从下面的程序中解决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);

    }

}
公共类ListSwapIndex{
公共静态void main(字符串[]args){
//TODO自动生成的方法存根
ArrayList swapIndex=新的ArrayList();
ArrayList swapIndextemp=新的ArrayList();
swapIndex.添加(“银行”);
swapIndex.添加(“Znk”);
swapIndex.add(“Bnk”);
swapIndex.添加(“Dnk”);
swapIndex.添加(“Enk”);
swapIndex.添加(“Lnk”);
用于(字符串:swapIndex){
if(string.equals(“Znk”)){
swapIndextemp.add(字符串);
swapIndex.移除(字符串);
}           
}
swapIndex温度加总(swapIndex);
系统输出打印LN(SWAPINDEXTEM);
}
}

不允许在迭代集合的同时修改集合。Java通过检查正在迭代的集合并在发现修改时快速失败来防止这种情况

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

for (ListIterator<String> iter=swapIndex.listIterator(); iter.hasNext() ; ) {
    String current = iter.next();
    if(current.equals("Znk")){
        swapIndextemp.add(string);
        iter.remove();
    }
}
for(ListIterator iter=swapIndex.ListIterator();iter.hasNext();){
字符串电流=iter.next();
如果(当前等于(“Znk”)){
swapIndextemp.add(字符串);
iter.remove();
}
}

但是,请注意,这种方法是次优的,因为从数组列表中删除是一个O(n)操作,导致整体性能为O(n2)。您最好迭代列表两次—一次将所有
“Znk”
放在前面,另一次将其余的项放在后面。这将使您的总体性能达到O(n)。

否,这是因为您同时修改了阵列。请改用矢量或同步的arraylist。请参阅可能重复的“无法使用增强的for循环进行存档”谢谢。这对我很有用。此外,您的解释有助于提高性能