集合ArrayList遍历修改问题

关于集合ArrayList的遍历修改问题:

/**
* 一个ArrayList对象aList中存有若干个字符串元素,
* 现欲遍历该ArrayList对象,删除其中所有值为"abc"的字符串元素
*/
import java.util.*;
public class Test3 {
        public static void main(String[] args) {
                ArrayList<String> aList=new ArrayList<String>();
                aList.add("bbc");
                aList.add("abc");
                aList.add("ysc");
                aList.add("abc");
                aList.add("xyza");
                aList.add("abc");
                
                System.out.println("移除前:"+aList);
                
                Iterator<String> it=aList.iterator();
                while(it.hasNext()){
                        if("abc".equals(it.next()))
                                it.remove();
                }
                
                System.out.println("移除后:"+aList);
        }
        
}
void remove()从迭代器指向的 collection 中移除迭代器返回的最后一个元素(可选操作)。每次调用 next 只能调用一次此方法。如果进行迭代时用调用此方法之外的其他方式修改了该迭代器所指向的 collection,则迭代器的行为是不确定的。

1.迭代器是作为当前集合的内部类实现的,当迭代器创建的时候保持了当前集合的引用;
2.集合内部维护一个字段叫modiCount,用来记录集合被修改的次数,比如add,remove,set等都会使该字段递增;
3.迭代器内部也维护着当前集合的修改次数的字段,迭代器创建时该字段初始化为集合的modiCount值
4.当每一次迭代时,迭代器会比较迭代器维护的字段和modiCount的值是否相等,如果不相等就抛ConcurrentModifiedException异常;
5.当然,如果用迭代器调用remove方法,那么集合和迭代器维护的修改字数都会递增,以保持两个状态的一致。


这就是为什么你只可以用迭代器来删除,而不能用其他方式来修改集合。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值