迭代集合时,删除集合元素会发生运行时异常
但两种情况除外
1.ArrayList,Vector,LinkedList等list集合,当使用Iterator遍历时,如果正在遍历倒数第2个元素,用List集合的
remove()方法不会引发异常。
package example; import java.util.ArrayList; import java.util.HashSet; import java.util.Iterator; import java.util.Set; public class Test { public static void main(String[] args) { ArrayList<String> list=new ArrayList<String>(); list.add("111"); list.add("222"); list.add("333"); Iterator<String> it=list.iterator(); while(it.hasNext()){ String ele=it.next(); //当迭代到第二个元素时 if(ele.equals("222")){ //直接删除集合中倒数第二个元素 list.remove(ele); } } System.out.println(list);//打印[111, 333] } }
2 对于Set集合有类似现象,删除最后一个元素不会发生异常
package example; import java.util.HashSet; import java.util.Iterator; import java.util.Set; import java.util.TreeSet; public class Test { public static void main(String[] args) { TreeSet<String> list=new TreeSet<String>(); list.add("111"); list.add("222"); list.add("333"); Iterator<String> it=list.iterator(); while(it.hasNext()){ String ele=it.next(); if(ele.equals("333")){ //直接删除集合中倒数第一个元素 list.remove(ele); } } System.out.println(list);//打印[111, 222] } }
原因:
1 List集合对应的Itreator实现类(Itr)的hasNext()方法
public boolean hasNext() {
return nextIndex < size;
}
当遍历到倒数第二个元素时,下一步即将访问的元素索引为size()-1。当List删除集合的任意元素后,size()变为size()-1,导致hasNext()返回false,
遍历提前结束。
2对于Set集合类似,如果当前正在遍历最后一个元素,也就是集合遍历已经完成,此时删除不会异常。
package example; import java.util.ArrayList; import java.util.Iterator; import java.util.List; public class Test { public static void main(String[] args) { List<String> list = new ArrayList<String>(); list.add("1"); list.add("2"); list.add("3"); list.add("4"); list.add("5"); System.out.println("Original list : " + list); System.out.println(); Iterator<String> i = list.iterator(); String temp = null; while (i.hasNext()) { temp = i.next(); System.out.println("Check for " + temp); if ("4".equals(temp)) { list.remove(temp); } } System.out.println("Removed list : " + list); } }
输出:
Original list : [1, 2, 3, 4, 5]
Check for 1
Check for 2
Check for 3
Check for 4
Removed list : [1, 2, 3, 5]