在做Lab02的实验的时候,再一次遇到了遍历List集合以及同时删除List集合中的元素的问题,本以为吸取了Lab01的经验教训,结果又没注意到,再一次错误的遍历,导致程序出现了问题,现对如何正确的遍历List进行了一个总结:
我最喜欢犯的错误:foreach+删除List集合的元素!
在循环过程中从List中删除元素以后,继续循环List时会报ConcurrentModificationException
错误2:for循环+删除LIst集合的元素
给出以下两种代码:
List<Student> students = new ArrayList<>();
int size = students.size();
for(int i = 0 ; i < size ; i++){
if(Xxx){
students.remove(xx);
}
}
首先这一种代码,很明显的会出现数组下标越界的异常,会提醒我们注意。
List<Student> students = new ArrayList<>();
for(int i = 0 ; i < students.size() ; i++){
if(Xxx){
students.remove(xx);
}
}
注意这一种,是不会出现数组下标越界这个问题的,因为每一次for循环,做条件判断的时候,都会获取以下students的size大小,但是,会出现遗漏的问题:
这种遍历有可能会遗漏某个元素,因为删除元素后List的size在变化,元素的索引也在变化,比如你循环到第2个元素的时候你把它删了,
接下来你去访问第3个元素,实际上访问到的是原先的第4个元素。
不会把List的每个元素都给遍历一边,比较不容易发现。因此,我们需要多加注意!
那么我们该如何正确的遍历呐?
使用迭代器的方式进行遍历:
Iterator<Student> iterator = students.iterator();
while (iterator.hasNext()) {
Student student = iterator.next();
if (xxx){
iterator.remove();
}
}
注意: 删除的时候,一定要使用迭代器的remove方法!!不要用List的删除方法!会出现ConcurrentModificationException!