您的位置:首页 > 其它

迭代时删除指定元素

2016-03-29 22:02 197 查看
迭代集合时,删除集合元素会发生运行时异常

但两种情况除外

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]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: