java集合迭代删除,一个很诡异的现象
无意看到一个很有趣的问题,和大家分享下。
public void method1(){
List<String> a = new java.util.ArrayList<String>();
a.add("1");
a.add("2");
for (String temp : a) {
if ("1".equals(temp)) {
a.remove(temp);
}
}
}
public void method2(){
List<String> a = new java.util.ArrayList<String>();
a.add("1");
a.add("2");
for (String temp : a) {
if ("2".equals(temp)) {
a.remove(temp);
}
}
}
初看method1和method2,我觉得都会顺利执行(无异常),然而,现实却是method2抛出异常
为什么删除第一个时不会异常,删除第二个就会异常呢?debug源码了,才发现,原来删除第一个和删除第二个都出现了问题,只是删除元素2会更明显的抛出异常。
首先我们要知道,for循环,jvm会在编译后,翻译为iterator迭代器,即
删除第一个元素的情况
当删除第二个元素的情况