zoukankan      html  css  js  c++  java
  • 迭代时删除指定元素

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

    但两种情况除外

    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]

  • 相关阅读:
    Spring Boot → 08:嵌入式Servlet容器自定义
    Spring Boot → 09:使用外置Servlet容器_tomcat9.0
    Spring Boot → 07:错误处理机制
    Spring Boot → 06:项目实战-账单管理系统
    Spring Boot → 05:Web开发
    zzz Objective-C的消息传递机制
    Objective-C中的SEL、IMP和Class类型(转)
    zzzObjective-C的动态特性
    zzz KVC/KVO原理详解及编程指南
    zzzzz iOS绘图教程
  • 原文地址:https://www.cnblogs.com/xurui1995/p/5335008.html
Copyright © 2011-2022 走看看