黑马程序员技术交流社区

标题: 迭代的问题【已解决】 [打印本页]

作者: 刘佳    时间: 2012-8-30 08:00
标题: 迭代的问题【已解决】
本帖最后由 刘佳 于 2012-8-30 11:02 编辑
  1. public class TestIterator
  2. {
  3.         public static void main(String[] args)
  4.         {
  5.                 Collection a = new HashSet();
  6.                 a.add("abc");
  7.                 a.add("ch");
  8.                 System.out.println("old:"+a);
  9.                 Iterator it = a.iterator();
  10.                 while (it.hasNext())
  11.                 {
  12.                         String b = (String)it.next();
  13.                         System.out.println("b:"+b);
  14.                         if (b.equals("ch"))
  15.                         {
  16.                                 //a.remove(b);
  17.                                 a.add("efg");
  18.                         }
  19.                 }
  20.                 System.out.println("new"+a);
  21.         }
  22. }
复制代码
Iterator在迭代Collection集合的过程中修改集合,程序在运行时会引发异常;为何我写的这个程序可以成功的编译和运行呢,哪里有问题?

作者: 袁艳超    时间: 2012-8-30 08:35
在用迭代器iterator迭代元素的时候,是不能够直接添加删除元素的,就是说不能进行修改,否则可能会产生异常。移除元素可以使用it.remove()这个方法是标记移除,等遍历完才真正删除。你上述程序没有发生异常是因为ch是set的最后一个元素
作者: 王桂丽    时间: 2012-8-30 08:52
首先,如果你不导包的话(import java.util.*;)程序编译是有问题的,如图一
其次,在迭代过程中是不能对元素进行操作的,如果你的equals不是指向集合的最后一个元素,运行时会出现如图2的结果

未命名1.jpg (31.07 KB, 下载次数: 38)

未命名1.jpg

未命名2.jpg (22.52 KB, 下载次数: 26)

未命名2.jpg

作者: 黑马-王言龙    时间: 2012-8-30 09:07
Iterator在迭代Collection集合的过程中修改集合,程序在运行时会引发异常;
"ch"是集合中的最后一个元素,表示迭代已经结束,而不是在迭代的过程中。
作者: 黑马-王言龙    时间: 2012-8-30 09:12
反证:把本程序中的equals("ch")替换成equals("abc")即报告异常。因为"abc"不是集合中的最后一个元素。
old:[abc,ch]
作者: 黑马张旭明    时间: 2012-8-30 09:40
毕老师视频里有说过的,在迭代过程中不能用集合对象的方法,因为在生成迭代器时迭代器已经记录了集合中的数据,这时如果用对象的方法改变集合,那和迭代器中的就不一样了,就会产生异常。这和上面说的一样,"ch"已经是最后一个元素,程序在取完最后一个元素以后才用的add("efg")方法,所以不会出异常。




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