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迭代器,即


删除第一个元素的情况



当删除第二个元素的情况




posted @ 2017-04-11 10:51  Bug开发攻城狮  阅读(142)  评论(0编辑  收藏  举报