【发布时间】:2014-09-18 18:42:08
【问题描述】:
下面的代码如预期的那样抛出java.util.ConcurrentModificationException:
public void test(){
ArrayList<String> myList = new ArrayList<String>();
myList.add("String 1");
myList.add("String 2");
myList.add("String 3");
myList.add("String 4");
myList.add("String 5");
for(String s : myList){
if (s.equals("String 2")){
myList.remove(s);
}
}
}
但是,以下代码不会抛出异常,而我希望它会被抛出:
public void test(){
ArrayList<String> myList = new ArrayList<String>();
myList.add("String 1");
myList.add("String 2");
myList.add("String 3");
for(String s : myList){
if (s.equals("String 2")){
myList.remove(s);
}
}
}
区别在于第一个列表包含5个项目,而第二个列表包含3个。使用的JVM是:
java version "1.8.0"
Java(TM) SE Runtime Environment (build 1.8.0-b132)
Java HotSpot(TM) 64-Bit Server VM (build 25.0-b70, mixed mode)
问题:为什么第二段代码NOT会抛出java.util.ConcurrentModificationException?
【问题讨论】:
-
我问了完全相同的问题。
-
其实不是同一个问题。你问为什么
remove没有失败。不同的问题,有不同的答案。 -
(
remove没有失败的原因是因为该调用中没有进行并发修改的测试!)