阿里開發手冊上:
7. 【強制】不要在foreach循環裏進行元素的remove/add操作。remove元素請使用Iterator
方式,如果併發操作,需要對Iterator對象加鎖。
正例:
Iterator<String> iterator = list.iterator();
while (iterator.hasNext()) {
String item = iterator.next();
if (刪除元素的條件) {
iterator.remove();
}
}
反例:
List<String> a = new ArrayList<String>();
list.add("1");
list.add("2");
for (String item : list) {
if ("1".equals(item)) {
list.remove(item);
}
}
說明:以上代碼的執行結果肯定會出乎大家的意料,那麼試一下把“1”換成“2”,會是同樣的
結果嗎?
List<String> list = new ArrayList<String>();
list.add("1");
list.add("2");
list.add("3");
for(int i=0;i<list.size();i++){
String s = list.get(i);
pl(s);
if("2".equals(s))list.remove(i);
//
// pl(list.size());
}
//結果
/*
1
2
最後的元素沒有遍歷到,達不到遍歷所有元素並按條件刪除
/*
反例中會出現錯誤,很多博客都很詳細說明了這點,這裏只是個人備忘下,做點補充