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~~~~~~~~~~~完美解决

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

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

    不足之处欢迎指正!

  • 相关阅读:
    eslint 的 env 配置是干嘛使的?
    cookie httpOnly 打勾
    如何定制 antd 的样式(theme)
    剑指 Offer 66. 构建乘积数组
    剑指 Offer 65. 不用加减乘除做加法
    剑指 Offer 62. 圆圈中最后剩下的数字
    剑指 Offer 61. 扑克牌中的顺子
    剑指 Offer 59
    剑指 Offer 58
    剑指 Offer 58
  • 原文地址:https://www.cnblogs.com/wlv1314/p/12124219.html
Copyright © 2011-2022 走看看