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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 侯金龙 中级黑马   /  2014-6-3 21:22  /  1506 人查看  /  9 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 侯金龙 于 2014-6-4 21:30 编辑
  1. import java.util.*;
  2. class  ListDemo
  3. {
  4.         public static void method_2()
  5.         {
  6.                 ArrayList al = new ArrayList();
  7.                 al.add("java01");
  8.                 al.add("java02");
  9.                 al.add("java03");
  10.                 al.add("java09");
  11.                
  12.                 for(Iterator it = al.iterator();it.hasNext();)
  13.                 {
  14.                         Object obj = it.next();
  15.                         if (obj.equals("java03"))
  16.                                 al.remove("java09");
  17.                 }
  18.                 sop(al);
  19.         
  20.         }
  21.         public static void main(String[] args)
  22.         {
  23.                 method_2();
  24.         }
  25.         public static void sop(Object obj)
  26.         {
  27.                 System.out.println(obj);
  28.         }
  29. }
复制代码

老师视频里说,用迭代器的方法和集合的方法同时操作不安全,我试了确实会发生异常,但是当迭代到倒数第二个元素,去删除最后一个元素时,运行却通过了这是为什么啊

评分

参与人数 1技术分 +1 收起 理由
枫儿 + 1

查看全部评分

9 个回复

倒序浏览
我刚试了下,也搞不清,我也期待答案
回复 使用道具 举报 1 0
本帖最后由 土突突 于 2014-6-4 00:35 编辑

你在进行迭代的时候删除了最后一个元素。并没有对迭代的过程出现影响。只能说当迭代的操作和集合的操作一起使用时可能会
出现异常。但这不是绝对的。
回复 使用道具 举报 1 0
土突突 发表于 2014-6-4 00:27
你在进行迭代的时候删除了最后一个元素。并没有对迭代的过程出现影响。只能说当迭代的操作和集合的操作一起 ...

在迭代器中操作了al.remove("java09");怎么就不是迭代的操作和集合的操作一起使用了
回复 使用道具 举报 1 0
我来学习了!!!!!!!!!
回复 使用道具 举报 1 0
我也试了一下,尝试着找个合理的解释,还是不通,等大神解释。。。
回复 使用道具 举报
怎么没人回答了?
回复 使用道具 举报
本帖最后由 苗润 于 2014-6-4 20:47 编辑

在使用迭代器遍历Arraylist的过程中,决不允许对集合的整体进行任何的添加删除操作(除了没有删除成功的,例如删除一个本来就没有在集合中的元素)
  1. ArrayList<Integer> list = new ArrayList();
  2. Collections.addAll(list,1,2,3,4,5);
  3. Iterator<Integer> it = list.iterator();
  4. while(it.hasNext)
  5. {
  6. Integer num = is.next();
  7. list.remove(new Integer(999));//这个是不会报错的,因为本来就不存在,因此删除没成功
  8. }
复制代码

在迭代器当中 它(即迭代器)会对集合中当前的元素或者当前的操作进行一个统计,如果它发现在它遍历集合的过程中,它的每一次next方法都会去检查剩余的元素是否和我应该剩余的元素是一样的,无论在你遍历的过程当中一次next到下一次next之间,只要你去添元素或者删元素,而没有通过迭代器去改变,当它再次执行到next方法时就会报并发修改异常,注意 并不是你删除或者添加的时候报错,而是你在修改以后,运行到下一次的next方法是报错,如果删除的是最后一个元素时,hasNext方法就会返回false 跳出循环,并不会运行到next方法 因此就不会报错了
回复 使用道具 举报
苗润 发表于 2014-6-4 20:13
在使用迭代器遍历Arraylist的过程中,决不允许对集合的整体进行任何的添加删除操作(除了没有删除成功的, ...

说的有道理,虽然我不确定你说的就是标准答案,但是你的解释我赞同,除此之外我也想不到其他的解释了,这个知识点你比我理解的深,谢谢
回复 使用道具 举报
侯金龙 发表于 2014-6-4 21:29
说的有道理,虽然我不确定你说的就是标准答案,但是你的解释我赞同,除此之外我也想不到其他的解释了,这 ...

多翻翻java源代码 里面有惊喜的~
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马