无法解析 list 中的方法 iterator_使用List中的remove方法遇到的坑,十个有九个踩...

先来看一下下面的样例是否符合你的问题场景

list中根据判断条件符合的就remove掉一个数据

 public static void main(String[] args) {        List list=new ArrayList();        CaseHead caseHead1=new CaseHead();        caseHead1.setCaseid("a");        CaseHead caseHead2=new CaseHead();        caseHead2.setCaseid("b");        CaseHead caseHead3=new CaseHead();        caseHead3.setCaseid("c");        CaseHead caseHead4=new CaseHead();        caseHead4.setCaseid("d");        CaseHead caseHead5=new CaseHead();        caseHead5.setCaseid("e");        list.add(caseHead1);        list.add(caseHead2);        list.add(caseHead3);        list.add(caseHead4);        list.add(caseHead5);        List list2=new ArrayList();        list2.add("a");        list2.add("b");        for (int i = 0; i 

结果是什么?

结果是一下。根据以上代码,希望得到的结果是 cde 但是运行结果是bcde那么问题来了为什么会得到一下结果呢

a9d5b3d35b77c515c0a27ed963e7aff1.png

先看一下list remove的源码

// 删除ArrayList指定位置的元素    public E remove(int index) {        RangeCheck(index);//检查index是否超出list大小范围,否则抛出异常        modCount++;        E oldValue = (E) elementData[index];//elementData是实现list的数组        int numMoved = size - index - 1;//当执行删除操作是后面的元素全部向前面移动一位        if (numMoved > 0)            System.arraycopy(elementData, index+1, elementData, index,                 numMoved);        elementData[--size] = null;        return oldValue;    }    // 删除ArrayList的指定元素    public boolean remove(Object o) {        if (o == null) {          for (int index = 0; index  0)              System.arraycopy(elementData, index+1, elementData, index,                               numMoved);          elementData[--size] = null;    } 

源码可知,List在删除指定位置的对象时,执行删除操作是后面的元素全部向前面移动一位

因为,当你remove掉一个对象时,list的就少了一个 index 0的被remove了,之前index 1的数据就自动变为index 0了。arrayList是有顺序数组,从0开始。如果从前开始删除实际上就相当于跳着删除了。

解决办法1:

每次删除之后i--自动返回到上一个index开始

    public static void main(String[] args) {        List list=new ArrayList();        CaseHead caseHead1=new CaseHead();        caseHead1.setCaseid("a");        CaseHead caseHead2=new CaseHead();        caseHead2.setCaseid("b");        CaseHead caseHead3=new CaseHead();        caseHead3.setCaseid("c");        CaseHead caseHead4=new CaseHead();        caseHead4.setCaseid("d");        CaseHead caseHead5=new CaseHead();        caseHead5.setCaseid("e");        list.add(caseHead1);        list.add(caseHead2);        list.add(caseHead3);        list.add(caseHead4);        list.add(caseHead5);        List list2=new ArrayList();        list2.add("a");        list2.add("b");        for (int i = 0; i 

第二种解决方法

倒着删除从后往前遍历删除,从index大的往index小的删

    public static void main(String[] args) {        List list=new ArrayList();        CaseHead caseHead1=new CaseHead();        caseHead1.setCaseid("a");        CaseHead caseHead2=new CaseHead();        caseHead2.setCaseid("b");        CaseHead caseHead3=new CaseHead();        caseHead3.setCaseid("c");        CaseHead caseHead4=new CaseHead();        caseHead4.setCaseid("d");        CaseHead caseHead5=new CaseHead();        caseHead5.setCaseid("e");        list.add(caseHead1);        list.add(caseHead2);        list.add(caseHead3);        list.add(caseHead4);        list.add(caseHead5);        List list2=new ArrayList();        list2.add("a");        list2.add("b");        for (int i = list.size()-1; i >= 0; i--) {            String caseid=list.get(i).getCaseid();            for (int j = 0; j 
26602ef2aa4e069957a41c5138aed3cc.png

此问题,本人仅在remove对象时发现到此错误。当list里面是基本类型数据时并没有发生以上问题。在此记好。仅供参考

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值