集合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方法,那么集合和迭代器维护的修改字数都会递增,以保持两个状态的一致。
这就是为什么你只可以用迭代器来删除,而不能用其他方式来修改集合。
声明:该文观点仅代表作者本人,入门客AI创业平台信息发布平台仅提供信息存储空间服务,如有疑问请联系rumenke@qq.com。