我有这样的场景
List<String> xxx = new ArrayList
for(String yyy : xxx){
for(String zzz:xyxy){
if(!zzz.equals(yyy)){
xxx.add(zzz);
}
}
}
但我得到java.util.ConcurrentModificationException:null exception.Can任何人都可以帮我解决这个问题。任何人都可以给我替代方法来执行此操作吗?
答案 0 :(得分:5)
此类的iterator和listIterator方法返回的迭代器是快速失败的:如果在创建迭代器之后的任何时候对列表进行结构修改,除非通过迭代器自己的删除或者添加方法,迭代器将抛出一个ConcurrentModificationException。
因此,您需要明确获取ListIterator
并使用它来正确更改ArrayList
。另外,我不相信你可以使用for-each循环,因为它们中的迭代器与显式检索的迭代器是分开的。我认为你必须使用while循环:
List<String> xxx = new ArrayList<>();
ListIterator<String> iterator = xxx.listIterator();
while (iterator.hasNext()) {
String s = iterator.next();
for (String zzz : xyxy) {
if (!zzz.equals(s)) {
iterator.add(zzz); //<-- Adding is done through the iterator
}
}
}
答案 1 :(得分:0)
将它们添加到另一个列表中,然后将该列表添加到xxx
;
List<String> xxx = new ArrayList<>();
List<String> additional = new ArrayList<>();
for (String yyy : xxx) {
for (String zzz : xyxy) {
if (!zzz.equals(yyy)) {
additional.add(zzz);
}
}
}
xxx.addAll(additional);
答案 2 :(得分:0)
不要使用foreach循环,但使用正常的循环,如:
int originalSize=xxx.size();
for (int i=0;i<originalSize;i++) {
xxx.add("New string appended at the end");
}
这允许您在开始迭代之前列出列表中的项目仅,如果列表上的唯一操作是添加一些最后的新项目。
答案 3 :(得分:0)
这意味着您无法同时访问和修改您的收藏(列表)。为此,您必须使用迭代器。我不明白你的代码中xyxy是什么。但元素的可能迭代和广告可能看起来像这样。
List<String> xxx = new ArrayList<String>();
xxx.add("hello");
xxx.add("hi");
xxx.add("hh");
ListIterator<String> it = xxx.listIterator();
while (it.hasNext()) {
if (!it.next().equals("hi")) {
it.remove();
it.add("hi");
}
}
System.out.println(xxx);
}
}
答案 4 :(得分:0)
要在迭代时修改列表,您可以将arraylist声明为&#34; java.util.concurrent.CopyOnWriteArrayList &#34;
public static void main(String[] args) {
List<String> xxx = new CopyOnWriteArrayList();
xxx.add("3");
xxx.add("4");
List<String> xyxy = new ArrayList();
xyxy.add("1");
xyxy.add("2");
xyxy.add("3");
for (String yyy : xxx) {
for (String zzz : xyxy) {
if (!zzz.equals(yyy)) {
xxx.add(zzz);
}
}
}
System.out.println(xxx);
}