迭代时删除指定元素

迭代集合时,删除集合元素会发生运行时异常

但两种情况除外

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]

原文地址:https://www.cnblogs.com/xurui1995/p/5335008.html