zoukankan      html  css  js  c++  java
  • 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);
        }
  • 相关阅读:
    关联原理说明
    一个软件测试工程师的学习体验
    缺陷漏测分析:测试过程改进
    自动化测试的7个步骤
    ACM题目————Subsequence
    ACM题目————Aggressive cows
    ACM题目————列变位法解密
    C++TSL之map容器(悲伤的故事)
    ACM题目————二叉树最大宽度和高度
    ACM题目————装箱问题
  • 原文地址:https://www.cnblogs.com/sunupo/p/15500207.html
Copyright © 2011-2022 走看看