List集合遍历删除符合某一条件的元素
1、为什么不能用For循环进行List便利删除
常规的循环方式例如:
for、forEach等
这两种方式执行删除操作均是删除不干净的,因为使用这种删除的方式其底层都是根据元素的索引值进行删除的,,这种方式下执行删除的只有两种结果:
- 删除后不会补位导致报空指针异常;
- for(Object o: obj)方式的情况就属于这种,这种情况下删除的数据不会进行补位,一旦删除某一数据后,在进行循环往下的时候就会发现上一个是空的,会报空指针异常(但是你以为会补位的循环就可以了吗?天真!请看下面这种问题~);
- 数据删除不干净;
- 删除不干净的原因:假使集合 list 中元素值为: [1、2、3、4] ,其中的元素 2 符合删除条件,当删除操作的指针走到 1时,就会触发检测到需要将此指针下数据删掉,因此当 2 被删除,一旦元素2被删除后后方的 3 就会进补,但是在删除完元素2之后,循环到元素3之前,元素3就会进行补位,那么,问题来了,循环判断删除的指针所对应的索引值刚才是1,现在往下走就是2了,而元素3因为补位,导致其元素的索引值变成了1,很好~完美错过了元素3的判断,因此,这种方式也会存在数据删除不干净的问题;
2、List集合遍历删除的正确姿势
采用迭代器
// 构建迭代器对象
Iterator<String> iterator = list.iterator();
// while循环
while (iterator.hasNext()) {
String li = iterator.next();
if ("条件".equals(li)) {
iterator.remove();
}
}
实战:
for (String r: set) {
Date hitAt = this.isHit(r);
if(hitAt == null){
Iterator<ProcessFlowVO> iterator = ProcessFlowList.iterator();
while (iterator.hasNext()) {
ProcessFlowVO s = iterator.next();
if (r.equals(s.getProjectId())) {
iterator.remove();
}
}
}
}