两种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");
}