public static void main(String[] args){
HashSet hs = new HashSet();
hs.add("1st");
hs.add("2nd");
hs.add(new Integer(3));
hs.add(new Double(4.8));
hs.add("2nd"); //导入重复元素
hs.add(new Integer(3)); //导入重复元素,不会成功,HashSet中不允许有重复元素
hs.add(new Date());
System.out.println("开始:size="+hs.size());
Iterator it = hs.iterator();
while(it.hasNext()){
Object o = it.next();
System.out.println(o);
}
System.out.println("---------------------------");
hs.remove("2nd");
System.out.println("移除元素后:size="+hs.size());
//下列循环未执行
while(it.hasNext()){
Object o = it.next();
System.out.println(o);
}
System.out.println("---------------------------");
System.out.println(hs);
}        为什么在删除之后的第二个遍历(Iterator)不能循环打印了,只是执行了第一次的遍历。学基础在,有点不清楚啊,请指教!!                                                                        

解决方案 »

  1.   

    容器内容变了,应该重新取得迭代对象.
    在第二个循环前加一句:it = hs.iterator();
      

  2.   

    并不是内容变了,而是楼主对iterator的理解不够,你可以把iterator理解为有状态的,它的内部会维护一个逻辑上的指针,这个指针指向当前可访问的对象,通过iterator.next()获取的就是这个指针指向的对象,每次next方法执行的时候,指针都会往下移位,这是原理。
    你在上一次遍历后,iterator的指针移位到元素的最末尾,这样iterator的hasNext()方法返回false,所以就不会输出,解决方法就是 重新再赋值,it=hs.iterator()方法,这样赋值后迭代器的逻辑指针会调整指向第一个元素
      

  3.   

    Iterator it = hs.iterator();
    这个迭代器对象,只能完成一次数据的迭代。
    要想第二次迭代,可以再次调用it = hs.iterator();生成新的迭代器对象。
      

  4.   

    恩,迭代器已经到了末尾,本来想找到有没有方法,返回第一个节点,API貌似没有这个方法。