迭代时删除指定元素
2016-03-29 22:02
197 查看
迭代集合时,删除集合元素会发生运行时异常
但两种情况除外
1.ArrayList,Vector,LinkedList等list集合,当使用Iterator遍历时,如果正在遍历倒数第2个元素,用List集合的
remove()方法不会引发异常。
2 对于Set集合有类似现象,删除最后一个元素不会发生异常
原因:
1 List集合对应的Itreator实现类(Itr)的hasNext()方法
public boolean hasNext() {
return nextIndex < size;
}
当遍历到倒数第二个元素时,下一步即将访问的元素索引为size()-1。当List删除集合的任意元素后,size()变为size()-1,导致hasNext()返回false,
遍历提前结束。
2对于Set集合类似,如果当前正在遍历最后一个元素,也就是集合遍历已经完成,此时删除不会异常。
输出:
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]
但两种情况除外
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]
相关文章推荐
- 树莓派3 编译驱动
- java中死锁的案例
- oracle聚簇表
- logistic和softmax代价函数
- 用ModelSim、Mars和Verilog做计算机组成原理CPU实验注意事项
- C# 访问修饰符internal的访问范围误区释疑
- PHP基本类型操作
- 应聘华为 16道经典面试题及回答思路
- c++ 继承(详细)
- Java Web中数据从前端输入到插入数据库,哪些地方需要考虑字符编码?
- xUtils简介
- 五大常用算法之一:分治算法
- XML—DTD约束
- javaEE 部门树状结构显示以及要注意的问题
- J2EE轻量级框架-3.29学习心得
- Lamp:Linux+apache(httpd)+mysql(mariadb)+php
- java synchronized 简单示例
- UITableviewcell的详尽
- 在action中将数据传给页面的三种方式
- linux gpio export