面試題:測試給定的list,使用for,foreach,iterator刪除元素的不同表現
阿新 • • 發佈:2018-12-13
上程式碼:
1. 使用增強for迴圈(foreach)
1 package com.xxx; 2 3 import java.util.ArrayList; 4 import java.util.List; 5 6 /** 7 * 測試給定的list,使用for,foreach,iterator刪除的不同表現 8 */ 9 public class TestForOfList { 10 public static void main(String[] args) { 11 List<Integer> list = new ArrayList<>();12 for (int i = 0; i < 10; i++) { 13 list.add(i); 14 } 15 16 //單獨使用會報錯,java.util.ConcurrentModificationException 17 for (Integer val : list) { 18 list.remove(val); 19 } 20 } 21 }
報以下錯誤:
Exception in thread "main" java.util.ConcurrentModificationException at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:909) at java.util.ArrayList$Itr.next(ArrayList.java:859) at com.company.TestForOfList.main(TestForOfList.java:25)
2. 使用for迴圈
1 package com.xxx; 2 3 import java.util.ArrayList; 4 import java.util.List; 5 6 /** 7 * 測試給定的list,使用for,foreach,iterator刪除的不同表現 8 */ 9 public class TestForOfList { 10 public static void main(String[] args) { 11 List<Integer> list = new ArrayList<>();12 for (int i = 0; i < 10; i++) { 13 list.add(i); 14 } 15 16 for (int i = 0; i < list.size(); i++) { 17 System.out.println(list.remove(i)); 18 } 19 20 } 21 }
結果是:
0 2 4 6 8
可見時可以刪除的,只是刪除的都是索引時偶數的。因為索引時動態調整的。
3. 使用iterator
1 package com.xxx; 2 3 import java.util.ArrayList; 4 import java.util.Iterator; 5 import java.util.List; 6 7 /** 8 * 測試給定的list,使用for,foreach,iterator刪除的不同表現 9 */ 10 public class TestForOfList { 11 public static void main(String[] args) { 12 List<Integer> list = new ArrayList<>(); 13 for (int i = 0; i < 10; i++) { 14 list.add(i); 15 } 16 17 Iterator<Integer> iter = list.iterator(); 18 while (iter.hasNext()) { 19 iter.next(); 20 iter.remove(); 21 } 22 System.out.println(list.size()); 23 24 } 25 }
結果是:
0
表面全部都刪除了。
總結以下,使用iterator能把list的元素區別刪除了;for只能刪除索引時偶數的元素;foreach刪除報錯。