当需要删除时,如何正确遍历List集合中的元素?

        在做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!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值