直接用代碼來說明: ...
直接用代碼來說明:
public class ForEach {
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("1");
list.add("2");
list.add("3");
// 第一種方法遍歷集合
for (int i = 0; i < list.size(); i++) {
System.out.println(list.get(i));
}
// 第二種方法遍歷集合
Iterator<String> iterator = list.iterator();
while(iterator.hasNext()){
String s = iterator.next();
// 不會出錯
if(s.equals("2")) {
iterator.remove();
}
System.out.println(s);
}
// 第三種方法遍歷集合(這裡有坑請註意)
for(String s : list){
System.out.println(s);
}
// 需要註意的是不能在增強for迴圈裡面使用remove來刪除元素
/*for(String s : list){
// 這裡會報java.util.ConcurrentModificationException錯
list.remove(s);
System.out.println(s);
}*/
// 這裡我們可以使用反編譯來查看他的反編譯後的代碼
// 反編譯後的代碼,由此可以看出增強for迴圈是通過迭代器模式實現的
/*String s;
for (Iterator iterator = list.iterator();iterator.hasNext(); System.out.println(i)){
s = (String)iterator.next();
}*/
// 所以說Iterator在工作的時候是不允許被迭代的對象改變
// 正確的在遍歷中刪除元素的姿勢應該是使用第二種迭代器的方式
}
}
總結:也就是說在使用for--each進行遍歷集合的時候,無法使用remove方法來刪除集合中的元素,這個要非常註意.