两种for循环的实质

第一种:实质上就是一个迭代器, 在遍历过程中修改元素值, 会报错java.util.ConcurrentModificationException, 这是因为迭代器中有参数expectModCount:预期被修改的次数  来做并发安全的控制

HashSet<String> s = new HashSet<>();
		s.add("1");
		s.add("2");
		s.add("3");
		for(String ss:s) {
			System.out.println(ss);
			s.remove("1");
		}

第二种: 是通过索引的位置去获取元素值, 会报错java.lang.IndexOutOfBoundsException

ArrayList<String> ss = new ArrayList<>();
		ss.add("1");
		ss.add("2");
		ss.add("3");
		
		for(int i=0;i<=1;i++) {
			System.out.println(ss.get(i));
			ss.remove(2);
		}

而改称如下形式则不会报错, 说明使用索引位置获取元素的遍历时, 是线程不安全的

ArrayList<String> ss = new ArrayList<>();
		ss.add("1");
		ss.add("2");
		ss.add("3");
		
		for(int i=0;i<=2;i++) {
			System.out.println(ss.get(i));
			ss.set(2, "6");
		}


posted @ 2017-09-19 19:32  車輪の唄  阅读(9)  评论(0编辑  收藏  举报  来源