兩種for迴圈的實質
阿新 • • 發佈:2019-02-06
第一種:實質上就是一個迭代器, 在遍歷過程中修改元素值, 會報錯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");
}