黑马程序员技术交流社区

标题: 集合ArrayList遍历修改问题 [打印本页]

作者: ┣┫流枫    时间: 2014-8-20 15:34
标题: 集合ArrayList遍历修改问题
本帖最后由 ┣┫流枫 于 2014-8-20 19:40 编辑



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

  1. package com.itheima;
  2. /**
  3. * 一个ArrayList对象aList中存有若干个字符串元素,
  4. * 现欲遍历该ArrayList对象,删除其中所有值为"abc"的字符串元素
  5. */
  6. import java.util.*;
  7. public class Test3 {
  8.         public static void main(String[] args) {
  9.                 ArrayList<String> aList=new ArrayList<String>();
  10.                 aList.add("bbc");
  11.                 aList.add("abc");
  12.                 aList.add("ysc");
  13.                 aList.add("abc");
  14.                 aList.add("xyza");
  15.                 aList.add("abc");
  16.                
  17.                 System.out.println("移除前:"+aList);
  18.                
  19.                 Iterator<String> it=aList.iterator();
  20.                 while(it.hasNext()){
  21.                         if("abc".equals(it.next()))
  22.                                 it.remove();
  23.                 }
  24.                
  25.                 System.out.println("移除后:"+aList);
  26.         }
  27.         
  28. }
复制代码

记得在迭代器遍历过程中不能对集合中的数据进行修改,否则会出现异常,这个怎么没事。求解释



作者: 郭旭辉    时间: 2014-8-20 15:44
大神。。你又出现了。。。顶下。
作者: 王责彬    时间: 2014-8-20 16:04
void remove()从迭代器指向的 collection 中移除迭代器返回的最后一个元素(可选操作)。每次调用 next 只能调用一次此方法。如果进行迭代时用调用此方法之外的其他方式修改了该迭代器所指向的 collection,则迭代器的行为是不确定的。
作者: masai158    时间: 2014-8-20 16:12
你使用的是迭代器在删除。。
如果你换成集合的话。就不可以了
作者: justin1258    时间: 2014-8-20 16:47
用迭代器本身删除没事。。。其他线程或用list自身删除就会有异常
作者: 华谦    时间: 2014-8-20 16:57
这个题目有个问题我很纳闷,为什么使用集合remove就不能移除呢???
作者: ┣┫流枫    时间: 2014-8-20 17:26
justin1258 发表于 2014-8-20 16:47
用迭代器本身删除没事。。。其他线程或用list自身删除就会有异常

嗯嗯 了解了    不过不深入   哈哈
作者: justin1258    时间: 2014-8-20 17:35
┣┫流枫 发表于 2014-8-20 17:26
嗯嗯 了解了    不过不深入   哈哈

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

这就是为什么你只可以用迭代器来删除,而不能用其他方式来修改集合。
作者: 郭旭辉    时间: 2014-8-20 17:55
郭旭辉 发表于 2014-8-20 15:44
大神。。你又出现了。。。顶下。

大神果然是大神。。。你去找他私聊。。申述。。
作者: ┣┫流枫    时间: 2014-8-20 19:40
justin1258 发表于 2014-8-20 17:35
要深入的?ok
1.迭代器是作为当前集合的内部类实现的,当迭代器创建的时候保持了当前集合的引用;
2.集合 ...

你超神了   膜拜
作者: justin1258    时间: 2014-8-20 19:46
┣┫流枫 发表于 2014-8-20 19:40
你超神了   膜拜

这个其实不难,看一下源码就知道了,有些书上也会提到。
作者: wfaly    时间: 2014-8-21 22:49
谢谢分享,了解了...




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2