黑马程序员技术交流社区

标题: 迭代器安全问题 [打印本页]

作者: 侯金龙    时间: 2014-6-3 21:22
标题: 迭代器安全问题
本帖最后由 侯金龙 于 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. }
复制代码

老师视频里说,用迭代器的方法和集合的方法同时操作不安全,我试了确实会发生异常,但是当迭代到倒数第二个元素,去删除最后一个元素时,运行却通过了这是为什么啊
作者: 何堂红    时间: 2014-6-3 23:30
我刚试了下,也搞不清,我也期待答案
作者: 土突突    时间: 2014-6-4 00:27
本帖最后由 土突突 于 2014-6-4 00:35 编辑

你在进行迭代的时候删除了最后一个元素。并没有对迭代的过程出现影响。只能说当迭代的操作和集合的操作一起使用时可能会
出现异常。但这不是绝对的。

作者: 侯金龙    时间: 2014-6-4 07:44
土突突 发表于 2014-6-4 00:27
你在进行迭代的时候删除了最后一个元素。并没有对迭代的过程出现影响。只能说当迭代的操作和集合的操作一起 ...

在迭代器中操作了al.remove("java09");怎么就不是迭代的操作和集合的操作一起使用了
作者: 任黎明    时间: 2014-6-4 08:43
我来学习了!!!!!!!!!
作者: 茂子    时间: 2014-6-4 09:08
我也试了一下,尝试着找个合理的解释,还是不通,等大神解释。。。
作者: 侯金龙    时间: 2014-6-4 18:22
怎么没人回答了?
作者: 苗润    时间: 2014-6-4 20:13
本帖最后由 苗润 于 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 21:29
苗润 发表于 2014-6-4 20:13
在使用迭代器遍历Arraylist的过程中,决不允许对集合的整体进行任何的添加删除操作(除了没有删除成功的, ...

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

多翻翻java源代码 里面有惊喜的~




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