如果已有一个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