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);
    }

 

上一篇:迭代器遍历移除空数据


下一篇:遍历Collection的两种方式: