黑马程序员技术交流社区

标题: 请教问题:关于迭代器对象定义的部位。[已解决] [打印本页]

作者: 李征雪    时间: 2012-4-10 09:29
标题: 请教问题:关于迭代器对象定义的部位。[已解决]
本帖最后由 李征雪 于 2012-4-10 11:19 编辑
  1. //Demo1403.java
  2. import java.util.*;

  3. class Demo1403
  4. {
  5.         public static void main(String[] args)
  6.         {
  7.                 ArrayList al = new ArrayList();
  8.                 //Iterator it = al.iterator();

  9.                 al.add("hello");
  10.                 al.add("world");
  11.                 al.add("java");
  12.                 al.add("hello");

  13.                 Iterator it = al.iterator();

  14.                 while(it.hasNext())
  15.                         System.out.println(it.next());

  16.                 System.out.println("Hello World!");
  17.         }
  18. }
复制代码
帮我看看第9行和第16行的代码Iterator it = al.iterator();,为什么相同一代码定义在al.add()前面会报错?
it不是个对象吗?不是应该定义在哪都一样吗?

作者: 高铭    时间: 2012-4-10 09:52
Iterator it = al.iterator();迭代器 是对集合取数据用的 还没有存数据  就直接取  会出异常------ 没有这个元素异常
不报异常你可以用LinkedList 1.6新特性用 offer添加数据. 但是回返回null,不出异常
作者: 郑苑东    时间: 2012-4-10 09:53
本帖最后由 郑苑东 于 2012-4-10 09:58 编辑

迭代时不允许其他线程修改集合中的内容。。而这时你定义在下面使用add修改了集合a1中的内容。。所以抛出了运行时异常ConcurrentModificationException。。。一个集合一旦定义了迭代。。那么你不能修改这个集合。。要不你迭代完修改。。而单线程的程序。。你违反了集合的顺序。。先往集合中加入元素。然后定义迭代器。的顺序也会抛出这个异常。。。。加入完成集合后再定义迭代就不会了。。或者你定义了迭代结束后。。在往其中加入元素。。
作者: 郑苑东    时间: 2012-4-10 09:59
koma501 发表于 2012-4-10 09:52
Iterator it = al.iterator();迭代器 是对集合取数据用的 还没有存数据  就直接取  会出异常------ 没有这 ...

你错了 。。你自己去运行一个。。然后看看抛出的异常是什么异常。。
作者: 高铭    时间: 2012-4-10 10:08
郑苑东 发表于 2012-4-10 09:59
你错了 。。你自己去运行一个。。然后看看抛出的异常是什么异常。。

ConcurrentModificationException并发修改异常
作者: 郑苑东    时间: 2012-4-10 10:11
本帖最后由 郑苑东 于 2012-4-10 10:18 编辑
koma501 发表于 2012-4-10 10:08
ConcurrentModificationException并发修改异常


我知道。。我不是写了吗。。你回复我。害我以为得分了。。坑我啊。。我也回复你一个。。。给你个惊喜。。。不过这里不是并发异常。。这是在主线程main中。只有一条线程。。所以没有什么线程并发修改的。。。这是因为他违反了定义集合的顺序。。要先加入元素。。然后迭代。。迭代完了才能在加入。。而上面他定义了之后什么也没有做。。这个异常介绍中有写。。。在加入元素之后使用了加入元素之前的迭代。。所以才会这样。。这样也算违反了规定啊。。。
作者: 袁计艳    时间: 2012-4-10 10:13
是这样的:
Iterator 是一个工作在独立的线程中的,Iterator被创建之后同时也创建了指向原来对象的单链索引表,
当原来的对象发生变化的时候,这个索引表的对象是不会同步放生变化的,也就是说:如果你的Iterator对象
放在了add方法的前面,当你在向list中添加数据的时候 原来的list中的内容是不会同步放生变化的,
所以就会抛出:java.util.ConcurrentModificationException
作者: 李征雪    时间: 2012-4-10 11:21
谢谢大家,现在明白了。




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