当我运行此功能时,尽管使用了java.util.ConcurrentModificationException
iterator.remove();
显然,我在循环中添加了数字6。这是否会发生,因为迭代器“不知道”它在那里并且无论如何都要修复它?
public static void main(String args[]){
List<String> list = new ArrayList<>();
list.add("1");
list.add("2");
list.add("3");
list.add("4");
list.add("5");
for(Iterator<String> it = list.iterator();it.hasNext();){
String value = it.next();
if(value.equals("4")) {
it.remove();
list.add("6");
}
System.out.println("List Value:"+value);
}
}
答案 0 :(得分:8)
调用String value = it.next();
时会抛出ConcurrentModificationException
。但实际的罪魁祸首是list.add("6");
。在直接迭代Collection
时,您不能修改it.remove();
。您使用的是list.add("6");
,但不是for(ListIterator<String> it = list.listIterator(); it.hasNext();){
String value = it.next();
if(value.equals("4")) {
it.remove();
it.add("6");
}
System.out.println("List Value:"+value);
}
。
但您可以解决此问题,但您需要ListIterator<String>
才能解决此问题。
List<String> newList = list.stream()
.map(s -> s.equals("4") ? "6" : s)
.collect(Collectors.toList());
这应该可以解决问题!
如果我可以提供Java 8替代方案:
Stream
我们在此处List
创建map
。我们"4"
所有值都归于自己,只有"6"
被映射到List
,然后我们将其收回newList
。但请注意,#include <stdio.h>
int main(void)
{
char a[50];
int x = 1;
while( x > 0){
gets(a);
int i,length=0;
for(i=0;a[i]!='\0';i++)
length+=1;
for(i=0;i<length;i++){
a[i]=a[i]^32;
}
printf("%s",&a);
}
}
是不可改变的!这也是效率较低,但更优雅(imho)。
答案 1 :(得分:0)
使用java集合类时,java.util.ConcurrentModificationException是一个非常常见的异常。 Java Collection类是快速失败的,这意味着如果在某个线程使用迭代器遍历它时将更改Collection,
iterator.next()
将throw ConcurrentModificationException
。
对于多线程以及单线程java编程环境,可能会出现并发修改异常。