不要在 foreach 循环里进行元素的 remove / add 操作。 remove 元素使用 Iterator方式,如果并发操作,需要对 Iterator 对象加锁。
import lombok.extern.slf4j.Slf4j;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
/**
* @Description:
*/
@Slf4j
public class ListTest {
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("1");
list.add("2");
list.add("3");
Iterator<String> it = list.iterator();
while (it.hasNext()){
String item = it.next();
if ("1".equals(item)){
it.remove();
}
}
log.info("list大小为:{}",list.size());
}
}
反例:
for (String item : list) {
if ("1".equals(item)) {
list.remove(item);
}
}
使用for 或 foreach 在删除指定下标是,list.size 会相应的缩短且下标前移,导致相邻满足条件的元素未删除。运行时会抛出java.util.ConcurrentModificationException异常。