• Java集合删除元素的坑


    • list删除某个元素时,该元素后面的元素往前移,将要删除的元素替换掉。所以需要在删除元素的时候,游标向前移动一位。
    • iterator迭代器中删除元素,源码中做了处理,游标自动前移一位。
    • foreach循环删除元素,
    //foreach也是使用迭代器(iterator)进行循环,相当于调用迭代器的next()方法,下面来看看next()方法:
            public E next() {
                checkForComodification();
                int i = cursor;
                if (i >= size)
                    throw new NoSuchElementException();
                Object[] elementData = ArrayList.this.elementData;
                if (i >= elementData.length)
                    throw new ConcurrentModificationException();
                cursor = i + 1;
                return (E) elementData[lastRet = i];
            }
    
    //从代码可以看出,next()方法调用了checkForComodification()方法,该方法用于检查数组是否被修改过,如果修改过就会抛出ConcurrentModificationException的异常,所以使用在foreach里面删除元素会抛异常。

    测试用例如下:

    @Test
        public void testDelete(){
            //会报错
                List<String> list = new ArrayList<>();
                list.add("1");
                list.add("2");
                list.add("3");
                list.add("4");
                list.add("5");
                System.out.println(list);
    //            Iterator<String> iterator = list.iterator();
                for (String s : list) {
                    int index = list.indexOf("4");
                    list.remove(index);
                }
                System.out.println(list);
    
        }
        @Test
        public void testDelete1(){
            //不报错,但是结果不对
    
            List<String> list = new ArrayList<>();
            list.add("1");
            list.add("2");
            list.add("4");
            list.add("4");
            list.add("5");
            System.out.println(list);
            list.remove("4");//只会删除一个4
            System.out.println(list);
        }
    
        @Test
        public void testDelete2(){
            //不报错,但是结果不对,第二个4无法删除
    
            List<String> list = new ArrayList<>();
            list.add("1");
            list.add("2");
            list.add("4");
            list.add("4");
            list.add("5");
            list.add("4");
            System.out.println(list);
            for (int i = 0; i < list.size(); i++) {
                if("4".equals(list.get(i))) {
                    list.remove(i);//
    //                --i;//下标减一就对了
                }
            }
            System.out.println(list);
        }
    
        @Test
        public  void testDd() {
            //采用迭代器iterator删除,正确
            List<String> list = new ArrayList<>();
            list.add("1");
            list.add("2");
            list.add("4");
            list.add("4");
            list.add("5");
            list.add("4");
            System.out.println(list);
            Iterator<String> iterator = list.iterator();
            while (iterator.hasNext()) {
                String s = iterator.next();
                if ("4".equals(s)) {
                    iterator.remove();
                }
            }
            System.out.println(list);
        }
        @Test
        public  void testDdd() {
            //报错, 采用iterator迭代过程中,使用原始的list对象删除元素 也会报错
            List<String> list = new ArrayList<>();
            list.add("1");
            list.add("2");
            list.add("4");
            list.add("4");
            list.add("5");
            list.add("4");
    
            System.out.println(list);
            Iterator<String> iterator = list.iterator();
            while (iterator.hasNext()) {
                String s = iterator.next();
                if ("4".equals(s)) {
                    list.remove(s);
                }
            }
            System.out.println(list);
        }
  • 相关阅读:
    Oracle结构连接配置结构
    理解cookie和session机制
    Asp.net中网站级异常捕获
    C#字符串函数大全
    一个简单的C#多线程间同步的例子
    SQL中的存储过程存放位置
    类和结构的区别?
    SQL点滴9—使用with语句来写一个稍微复杂sql语句
    Asp.NET 的Session实现原理 转自21kaiyun.com
    Script to analyze table space usage
  • 原文地址:https://www.cnblogs.com/sunupo/p/15500207.html
Copyright © 2020-2023  润新知