gpt4 book ai didi

java - 并发修改异常

转载 作者:行者123 更新时间:2023-11-30 06:52:46 25 4
gpt4 key购买 nike

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

}

}

最佳答案

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

使用 ListIterator<T> 而不是迭代 for -each 循环修复了问题,因为 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) 的整体性能。

关于java - 并发修改异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38414406/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com