zoukankan      html  css  js  c++  java
  • 循环删除List集合的元素

    之前在使用list集合循环删除元素的时候,竟然出现了集合内的元素不能删除成功的问题,之后整理了一下,发现大有玄机!

    1.如果指定了list的size大小,会出现下标越界异常

    List<String> list=new ArrayList<>();
    list.add("a");
    list.add("b");
    list.add("c");
    list.add("d");
    list.add("e");

    System.out.println("删除前的list:"+list.toString());
    for (int i = 0,len=list.size(); i < len; i++) {
    if("c".equals(list.get(i))){
    list.remove(i);
    }
    }
    System.out.println("删除后的list"+list.toString());

    Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 4, Size: 4

    因为当删除元素c的时候,list集合大小改变了

    2.如果每次都动态的获取list的size,当删除多个元素的时候会出现后面元素删除不成功的问题。

    List<String> list=new ArrayList<>();
    list.add("a");
    list.add("b");
    list.add("c");
    list.add("d");
    list.add("e");
    list.add("f");

    System.out.println("删除前的list:"+list.toString());
    for (int i = 0; i < list.size(); i++) {
    if("c".equals(list.get(i))||"d".equals(list.get(i))){
    list.remove(i);
    }
    }
    System.out.println("删除后的list"+list.toString());

      删除前的list:[a, b, c, d, e, f]
      删除后的list[a, b, d, e, f]

    经过分析:当list删除元素c的时候,此时的i=2,后面的元素会向前补一位,进行下一次循环的时候,此时list集合中的元素为[a, b, d, e, f],i=3,这样会跳过d,从而导致d元素不能删除成功。

    3.增强for循环方式删除元素,java.util.ConcurrentModificationException

    List<String> list=new ArrayList<>();
    list.add("a");
    list.add("b");
    list.add("c");
    list.add("d");
    list.add("e");
    list.add("f");

    System.out.println("删除前的list:"+list.toString());
    for (String s : list) {
    if("c".equals(s)){
    list.remove(s);
    }
    }
    System.out.println("删除后的list"+list.toString());

     

    Exception in thread "main" java.util.ConcurrentModificationException
    删除前的list:[a, b, c, d, e, f]
    at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:901)
    at java.util.ArrayList$Itr.next(ArrayList.java:851)
    at operation.ListRemove.main(ListRemove.java:23)

    从错误中可以定位到checkForComodification(ArrayList.java:901)

     当modCount和expectedModeCount不相等时就会抛出此异常。

    modCount是ArrayList类中的一个成员变量,表示对ArrayList的修改次数

    expectedModCount:表示对ArrayList修改次数的期望值,它的初始值为modCount

    当循环遍历的时候二者是相等的,但是当执行list.remove()方法后,

     

     可以看到modCount++,元素前移,最后一位置空,但是expectedModCount并没有改变。

    这就导致modCount和expectedModCount的值不一致。

    删除完再次遍历的时候,

     此时就会抛出异常了。

    4.正确的删除方式

    难道就不能删除了吗???这是不可能的,正确的姿势是什么呢?那就是迭代器--Iterator了

    List<String> list=new ArrayList<>();
    list.add("a");
    list.add("b");
    list.add("c");
    list.add("d");
    list.add("e");
    list.add("f");
    System.out.println("删除前的list:"+list.toString());
    Iterator<String> iterator = list.iterator();
    while (iterator.hasNext()){
    String next = iterator.next();
    if("c".equals(next)){
    iterator.remove();
    }
    }
    System.out.println("删除后的list"+list.toString());

    删除前的list:[a, b, c, d, e, f]
    删除后的list[a, b, d, e, f]

    binggo~~~~~~~~~~~完美解决

    其实:如果只是删除某一个元素,上面的方法都可以。

    如果是循环删除多个,还是用迭代器吧!

    不足之处欢迎指正!

  • 相关阅读:
    [Vue] Computed property "XXX" was assigned to but it has no setter.
    vue路由传参的三种基本方式
    ECharts大屏数据可视化展板项目 适配rem
    vue-cli3.0结合lib-flexible、px2rem实现适配,完美解决第三方ui库样式变小问题
    element-ui 实现行合并-亲测有效!
    ui自动化用Tesseract类截取和识别验证码【多测师】
    史上最全软件测试工程师常见的面试题总结(一)【多测师】
    Python操作非关系型数据库Redis【多测师】
    Java当中的重载和重写的区别【多测师】
    3道经典的Python练习题【多测师】
  • 原文地址:https://www.cnblogs.com/wlv1314/p/12124219.html
Copyright © 2011-2022 走看看