Set<String> s = new HashSet();
s.add("111");
s.add("222");
s.add("333");
//能运行正常
Iterator it = s.iterator();
while(it.hasNext())
{
System.out.println(it.next());
}
//运行不正常
while(s.iterator().hasNext())
{
System.out.println(s.iterator().next());
}
请问两断代码有什么不同..

解决方案 »

  1.   

    上面的代码只取一个迭代器对象,遍历完所有对象后,程序结束;
    而下面的代码,每次运行s.iterator(),就获得一个迭代器对象。所以每循环一次,产生两个跌代器对象。下次循环时,将产生两个新的对象,原来的两个对象没有引用指向,会变成垃圾;所以代码会无限期循环,输出的总是第一个元素。
      

  2.   

    Iterator it = s.iterator()这样写,再while(it.hasNext())
      

  3.   

    一楼正解。
    不过还是建议楼主使用增强for
    看起来简洁,用起来方便。
    for(Object o:s){
    system.out.println("o.toString")
    }
      

  4.   

    看了楼主的代码,我有两方面看法
    第一 我觉得还是楼主的基础比较差
         平时应该多注意修炼下基本功
    第二 我想解释下这个程序里设计的一些概念
         Set 容器,用来装对象的
         Iterator 迭代器,用来访问容器的一种手段(注意:只是其中的一种)
         所以 Iterator it = s.iterator(); 有一次就够了,
         而while(s.iterator().hasNext()) 循环取得访问容器手段,用该手段判断容器是否有值
         
         要记住取得访问容器的手段,一次就够了!取得手段后,在手段里做遍历!