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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 何伟 中级黑马   /  2013-1-3 00:45  /  5684 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

package day16_01_collection;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
public class CollectionDemo5
{
public static void main(String[] args)
{
  //fun();
  fun1();
}
public static void fun1()
{
  Collection c = new ArrayList();
  c.add("zhangsan");
  c.add("lisi");
  c.add("wangwu");
  
  Iterator it = c.iterator();
  c.add("zhaoliu");
  
  while(it.hasNext())
  {
   System.out.println(c.next());
  }
}

我在测试或取迭代器后,再调用add方法抛异常,结果出现无限循环。求解???

评分

参与人数 1技术分 +1 收起 理由
奋斗的青春 + 1 赞一个!

查看全部评分

7 个回复

倒序浏览
LZ的代码有3个地方错误
1、整个代码少了一个大括号。
2、 while(it.hasNext()){
           System.out.println(c.next());  这里应该是it.next(); 不是c.next();
      }
3、在对集合进行iterator操作后,在这个iterator遍历的过程中是不能改变集合的值的,因为iterator生产的一个新的对象,你再做操作是没有改变原来真正的集合,会报异常java.util.ConcurrentModificationException

也就是你的代码这里有问题

Iterator it = c.iterator();
  c.add("zhaoliu");---------这里不能对集合c做操作,因为你前面已经iterator,而且这个遍历并没有走完,所以你在这里添加元素会导致后面的遍历出问题。利用iterator遍历的时候是不能对对象做操作的
  while(it.hasNext()) {
   System.out.println(c.next());
  }

你可以在遍历结束和添加
Iterator it = c.iterator();
  while(it.hasNext()) {
   System.out.println(c.next());
  }
  c.add("zhaoliu");

评分

参与人数 1技术分 +1 收起 理由
古银平 + 1 神马都是浮云

查看全部评分

回复 使用道具 举报
要确保Iterator遍历过程顺利完成,必须保证遍历过程中不更改集合的内容(Iterator的remove()方法除外),
因此,确保遍历可靠的原则是:
只在一个线程中使用这个集合,或者在多线程中对遍历代码进行同步。
所以lz一个线程下就更不可以c.add("zhaoliu");了、、、
而且这种做法也不合理,在遍历过程中,向集合中添加一个对象,不符合现实。

评分

参与人数 1技术分 +1 收起 理由
古银平 + 1 神马都是浮云

查看全部评分

回复 使用道具 举报
张森 发表于 2013-1-3 01:36
LZ的代码有3个地方错误
1、整个代码少了一个大括号。
2、 while(it.hasNext()){

少大括号?我是在测试获取迭代器后在用add方法会报错,你说出错误了,是IT.next不是c.next
回复 使用道具 举报
获得了迭代器之后在添加元素,迭代器对象还是未添加之前的。

这个和张老师讲的hashCode那个差不多吧。
在对类重写了hashcode方法后(用成员变量算出)。
把类对象存入hash集合,然后又改变了对象的成员变量(这时重新计算了hashCode),然后把这个对象从集合中删除,结果没有删掉。

但没有发现无限循环啊。不懂。2楼说的很全面。

评分

参与人数 1技术分 +1 收起 理由
古银平 + 1 神马都是浮云

查看全部评分

回复 使用道具 举报
何伟 发表于 2013-1-3 10:17
少大括号?我是在测试获取迭代器后在用add方法会报错,你说出错误了,是IT.next不是c.next ...

我也不知道怎么说了  你看见我说的3个错误吗
好吧第二点  确实是我二了
只有少括号  你自己再看看你自己的代码 到底是不是少括号


回复 使用道具 举报
张森 发表于 2013-1-3 10:37
我也不知道怎么说了  你看见我说的3个错误吗
好吧第二点  确实是我二了
只有少括号  你自己再看看你自己 ...

不好意思啊,复制的时候少了个括号,你指出了代码错误,无限循环的原因是while判断用的是it.hasnext循环体却是用的c.next.这就导致了无限循环,非常感谢兄弟的解答
回复 使用道具 举报
何伟 发表于 2013-1-3 12:15
不好意思啊,复制的时候少了个括号,你指出了代码错误,无限循环的原因是while判断用的是it.hasnext循环 ...

我也新手 以后大家共勉
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马