黑马程序员技术交流社区

标题: while(it.next())怎么无限循环啊? [打印本页]

作者: 何伟    时间: 2013-1-3 00:45
标题: while(it.next())怎么无限循环啊?
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方法抛异常,结果出现无限循环。求解???

作者: 张森    时间: 2013-1-3 01:36
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");

作者: 刘文超    时间: 2013-1-3 09:28
要确保Iterator遍历过程顺利完成,必须保证遍历过程中不更改集合的内容(Iterator的remove()方法除外),
因此,确保遍历可靠的原则是:
只在一个线程中使用这个集合,或者在多线程中对遍历代码进行同步。
所以lz一个线程下就更不可以c.add("zhaoliu");了、、、
而且这种做法也不合理,在遍历过程中,向集合中添加一个对象,不符合现实。
作者: 何伟    时间: 2013-1-3 10:17
张森 发表于 2013-1-3 01:36
LZ的代码有3个地方错误
1、整个代码少了一个大括号。
2、 while(it.hasNext()){

少大括号?我是在测试获取迭代器后在用add方法会报错,你说出错误了,是IT.next不是c.next
作者: 清水    时间: 2013-1-3 10:26
获得了迭代器之后在添加元素,迭代器对象还是未添加之前的。

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

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

作者: 张森    时间: 2013-1-3 10:37
何伟 发表于 2013-1-3 10:17
少大括号?我是在测试获取迭代器后在用add方法会报错,你说出错误了,是IT.next不是c.next ...

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



作者: 何伟    时间: 2013-1-3 12:15
张森 发表于 2013-1-3 10:37
我也不知道怎么说了  你看见我说的3个错误吗
好吧第二点  确实是我二了
只有少括号  你自己再看看你自己 ...

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

我也新手 以后大家共勉




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