【问题标题】:Concurrent Modification Exception并发修改异常
【发布时间】:2016-11-19 17:51:18
【问题描述】:

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

    }

}

【问题讨论】:

  • 不,这是因为您正在同时修改数组。请改用向量或同步数组列表。
  • 查看 this 可能重复的“无法使用增强的 for 循环存档”

标签: java arraylist


【解决方案1】:

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

使用ListIterator&lt;T&gt; 而不是使用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(n2) 的整体性能。您最好将列表迭代两次 - 一次将所有 "Znk"s 放在前面,再一次将其余项目放在后面。这为您提供了 O(n) 的整体性能。

【讨论】:

  • 谢谢..这对我有用。另外,您的解释有助于提高性能
猜你喜欢
  • 2013-03-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-24
  • 1970-01-01
相关资源
最近更新 更多