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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 刘佳 中级黑马   /  2012-8-30 08:00  /  2017 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 刘佳 于 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集合的过程中修改集合,程序在运行时会引发异常;为何我写的这个程序可以成功的编译和运行呢,哪里有问题?

5 个回复

倒序浏览
在用迭代器iterator迭代元素的时候,是不能够直接添加删除元素的,就是说不能进行修改,否则可能会产生异常。移除元素可以使用it.remove()这个方法是标记移除,等遍历完才真正删除。你上述程序没有发生异常是因为ch是set的最后一个元素

评分

参与人数 1黑马币 +1 收起 理由
黑马-王言龙 + 1 赞一个!

查看全部评分

回复 使用道具 举报
首先,如果你不导包的话(import java.util.*;)程序编译是有问题的,如图一
其次,在迭代过程中是不能对元素进行操作的,如果你的equals不是指向集合的最后一个元素,运行时会出现如图2的结果

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

未命名1.jpg

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

未命名2.jpg
回复 使用道具 举报
Iterator在迭代Collection集合的过程中修改集合,程序在运行时会引发异常;
"ch"是集合中的最后一个元素,表示迭代已经结束,而不是在迭代的过程中。
回复 使用道具 举报
反证:把本程序中的equals("ch")替换成equals("abc")即报告异常。因为"abc"不是集合中的最后一个元素。
old:[abc,ch]
回复 使用道具 举报
毕老师视频里有说过的,在迭代过程中不能用集合对象的方法,因为在生成迭代器时迭代器已经记录了集合中的数据,这时如果用对象的方法改变集合,那和迭代器中的就不一样了,就会产生异常。这和上面说的一样,"ch"已经是最后一个元素,程序在取完最后一个元素以后才用的add("efg")方法,所以不会出异常。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马