Java 从每个循环的内部移除ArrayList的元素时。它打破了循环
从Java 从每个循环的内部移除ArrayList的元素时。它打破了循环,java,arraylist,foreach,Java,Arraylist,Foreach,从foreach循环内部删除ArrayList的元素时。它打破了循环。 抛出ConcurrentModificationException 我的问题是为什么它打破了循环 代码 ArrayList gStudyLst=getLst(); int recordCount=0; for(String study : gStudyLst){ if(++recordCount < 10){ if(generateFile(study)){
foreach
循环内部删除ArrayList
的元素时。它打破了循环。抛出ConcurrentModificationException
我的问题是为什么它打破了循环 代码
ArrayList gStudyLst=getLst();
int recordCount=0;
for(String study : gStudyLst){
if(++recordCount < 10){
if(generateFile(study)){
gStudyLst.remove(study); // there its break throw ConcurrentModificationException
}else{
System.out.println("File not generated"):
gStudyLst.clear();
return false;
}
}
}else{
return true;
}
}
ArrayList gStudyLst=getLst();
int recordCount=0;
用于(字符串研究:gStudyLst){
如果(++记录计数<10){
if(生成文件(研究)){
gStudyLst.remove(study);//这里有它的break-throw-ConcurrentModificationException
}否则{
System.out.println(“未生成文件”):
gStudyLst.clear();
返回false;
}
}
}否则{
返回true;
}
}
用于避免ConcurrentModificationException迭代器
接口的Java文档说:
迭代器允许调用方从基础结构中删除元素
使用定义良好的语义在迭代期间收集
以下是一个例子:
Iterator<String> iter = myArrayList.iterator();
while (iter.hasNext()) {
String str = iter.next();
if (someCondition)
iter.remove();
}
迭代器iter=myArrayList.Iterator();
while(iter.hasNext()){
String str=iter.next();
如果(某些条件)
iter.remove();
}
用于避免ConcurrentModificationException迭代器
接口的Java文档说:
迭代器允许调用方从基础结构中删除元素
使用定义良好的语义在迭代期间收集
以下是一个例子:
Iterator<String> iter = myArrayList.iterator();
while (iter.hasNext()) {
String str = iter.next();
if (someCondition)
iter.remove();
}
迭代器iter=myArrayList.Iterator();
while(iter.hasNext()){
String str=iter.next();
如果(某些条件)
iter.remove();
}
这是因为该类的迭代器和listIterator方法返回的迭代器是快速失效的:如果在迭代器创建后的任何时候以任何方式(除迭代器自己的remove或add方法外)修改列表的结构,迭代器将抛出ConcurrentModificationException。因此,在面对并发修改时,迭代器会快速、干净地失败,而不会在将来的不确定时间冒任意、不确定行为的风险。”
有关详细信息,请参阅。这是因为“该类的迭代器和listIterator方法返回的迭代器故障很快:如果在创建迭代器后的任何时间,以迭代器自己的remove或add方法以外的任何方式对列表进行结构修改,迭代器将抛出ConcurrentModificationException。因此,在面对并发修改时,迭代器会快速、干净地失败,而不会在将来的不确定时间冒任意、不确定行为的风险。”
有关详细信息,请参阅。for each循环仅用于遍历arraylist的值。如果要删除循环中的值,请使用如下所示的迭代器
for (Iterator iterator = gStudyLst.iterator(); iterator.hasNext();) {
String study = (String) iterator.next();
}
for each循环仅用于遍历arraylist的值
for (Iterator iterator = gStudyLst.iterator(); iterator.hasNext();) {
String study = (String) iterator.next();
}
增强型for语句的形式如下: (类型标识符:表达式)语句的
增强型for语句相当于以下形式的基本for语句:
for(I iter=Expression.iterator();iter.hasNext();){
类型标识符=iter.next();
陈述
}
从javaDoc:
这个类的迭代器和listIterator方法返回的迭代器是快速失效的:如果在迭代器创建后的任何时候,列表在结构上被修改,除了通过迭代器自己的remove或add方法,迭代器将抛出ConcurrentModificationException
因此,不要使用forEach
而是使用Iterater
并使用迭代器自己的remove或add方法修改列表。增强型for语句的形式如下:
(类型标识符:表达式)语句的
增强型for语句相当于以下形式的基本for语句:
for(I iter=Expression.iterator();iter.hasNext();){
类型标识符=iter.next();
陈述
}
从javaDoc:
这个类的迭代器和listIterator方法返回的迭代器是快速失效的:如果在迭代器创建后的任何时候,列表在结构上被修改,除了通过迭代器自己的remove或add方法,迭代器将抛出ConcurrentModificationException
因此,不要使用forEach
使用Iterater
并使用迭代器自己的remove或add方法修改列表。是的,您需要使用iterator.remove()或索引的remove。是的,您需要使用iterator.remove()或索引的remove。iter.remove()可以从myArrayList中删除元素吗?@Pawanmishra:可以。iter.remove()可以从myArrayList中删除元素吗?@Pawanmishra:可以。