A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© ┣┫流枫 中级黑马   /  2014-8-20 15:34  /  8336 人查看  /  12 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 ┣┫流枫 于 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. }
复制代码

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


评分

参与人数 1技术分 +1 收起 理由
格子、 + 1 淡定

查看全部评分

12 个回复

倒序浏览
大神。。你又出现了。。。顶下。

点评

今天刚把博客给过了,不是白杨给我改的,呜呜 ,换了个男的,给我19.5,不知道那扣的分  发表于 2014-8-20 17:27
回复 使用道具 举报
void remove()从迭代器指向的 collection 中移除迭代器返回的最后一个元素(可选操作)。每次调用 next 只能调用一次此方法。如果进行迭代时用调用此方法之外的其他方式修改了该迭代器所指向的 collection,则迭代器的行为是不确定的。
回复 使用道具 举报
你使用的是迭代器在删除。。
如果你换成集合的话。就不可以了
回复 使用道具 举报
用迭代器本身删除没事。。。其他线程或用list自身删除就会有异常
回复 使用道具 举报 1 0
这个题目有个问题我很纳闷,为什么使用集合remove就不能移除呢???
回复 使用道具 举报
justin1258 发表于 2014-8-20 16:47
用迭代器本身删除没事。。。其他线程或用list自身删除就会有异常

嗯嗯 了解了    不过不深入   哈哈
回复 使用道具 举报
┣┫流枫 发表于 2014-8-20 17:26
嗯嗯 了解了    不过不深入   哈哈

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

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

评分

参与人数 1技术分 +1 收起 理由
格子、 + 1 赞一个!

查看全部评分

回复 使用道具 举报
郭旭辉 发表于 2014-8-20 15:44
大神。。你又出现了。。。顶下。

大神果然是大神。。。你去找他私聊。。申述。。
回复 使用道具 举报
justin1258 发表于 2014-8-20 17:35
要深入的?ok
1.迭代器是作为当前集合的内部类实现的,当迭代器创建的时候保持了当前集合的引用;
2.集合 ...

你超神了   膜拜
回复 使用道具 举报

这个其实不难,看一下源码就知道了,有些书上也会提到。
回复 使用道具 举报
wfaly 中级黑马 2014-8-21 22:49:38
12#
谢谢分享,了解了...
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马