List<Integer> list = new ArrayList<>(Arrays.asList(1,2,3,4,5));
for (int i = 0; i < list.size(); i++) {
list.remove(i);
System.out.println(list);
}
[2, 3, 4, 5]
[2, 4, 5]
[2, 4]
上述代码存在的问题:当移除索引为 i 的元素后,原索引为 i+1 的元素的索引变为 i ,接下来遍历索引为 i+1 的元素时,原索引为 i+1 的元素被跳过。
那么要如何在遍历容器的同时移除其中的元素呢?
答案是使用容器的迭代器,迭代器有一个remove方法可以满足我们的需求。
List<Integer> list = new ArrayList<>(Arrays.asList(1,2,3,4,5));
Iterator<Integer> iter = list.iterator();
while (iter.hasNext()) {
iter.next();
iter.remove();
System.out.println(list);
}
[2, 3, 4, 5]
[3, 4, 5]
[4, 5]
[5]
[]
需要注意的是在使用迭代器遍历容器时,不能使用容器自身或新的迭代器的方法进行添加删除,否则会抛出 ConcurrentModificationException
。如下:
List<Integer> list = new ArrayList<>(Arrays.asList(1, 2, 3, 4, 5));
for (Integer item : list) {
list.remove(1); // 或则 list.add
System.out.println(list);
}
[1, 3, 4, 5]
at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:901)
at java.util.ArrayList$Itr.next(ArrayList.java:851)
at test.Test.main(Test.java:50)