【JAVA】List在进行remove操作时的坑

如果已有一个List, 你想对其遍历然后在过程中对某些元素进行删除操作的话,你会怎么做?

按下标直接遍历

List<Integer> list = new ArrayList<Integer>();
        list.add(1);
        list.add(2);
        list.add(3);
        list.add(4);
        list.add(5);
        list.add(6);

        for (int i = 0; i < list.size(); i++) {
            if (碰到125就删除) { //也可以是别的条件,这里只是示例
                list.remove(i);
            }
        }

看起来似乎可以。但实际上这种操作会由于删除元素后元素补位,导致数组下标超越了本应该下一次遍历的元素而导致的遗漏。 比如这里我们执行到i = 0 元素是1, rm掉这个元素后 元素2补位成为了i=0位置的元素,然而我们下一步遍历就直接i=1是元素3,这样就漏删掉了2…

回退下标方法

其实很简单,在每一次remove(i–) 操作中i–就可以了,这样可以保证补位元素不会被跳过。

最好还是利用iterator


Iterator<Map<String,Object>> iterator = rawList.iterator();
        while(iterator.hasNext()) {
            Map<String, Object> map = iterator.next();
            String pId = (String)map.get(Constant.PID); 
            String sId = (String)map.get(Constant.SID);
            String serId = (String)map.get(Constant.SerID);  
            XXTask task = xxxMapper.getByBusinessId(pId, sId, serId);   
            if(null != task) {
                iterator.remove();    // 这种非下标方式的remove可以规避掉很多坑,略
            }
        }

图省事,稍微改了改已有的东西,能看懂就就行。 用iterator的remove操作不是利用下标,安全无污染~~

倒序remove

这种方式也可以规避下标跳跃,但还是建议使用iterator

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值