黑马程序员技术交流社区

标题: 菜鸟:Iterator 小问题? [打印本页]

作者: 李志广    时间: 2012-7-13 15:12
标题: 菜鸟:Iterator 小问题?
本帖最后由 007lzg 于 2012-7-13 15:56 编辑

import java.util.*;
class ListDemo
{    public static void sop(Object obj)
    {
        System.out.println(obj);
    }
    public static void main(String[] args)
    {
        ArrayList al=new ArrayList();
        al.add("java01");
        al.add("java02");
        al.add("java03");
        Iterator it=al.iterator();
        while(it.hasNext())
            {
            Object obj=it.next();
            if(obj.equals("java02"))
                it.remove();
            sop("obj="+obj);
            }
            sop(al);
    }
}
在上面的语句中it.remove();不是已经把java02给删除了吗?为什么 在sop("obj="+obj);还会有java02呢?


作者: 陆强强    时间: 2012-7-13 15:16
sop("obj="+obj)打印的是你遍历到的对象,和你对集合的操作无关
作者: 吴小东    时间: 2012-7-13 15:24
哥们你这是属于逻辑上出现问题了,
while(it.hasNext())
            {
            Object obj=it.next();
            if(obj.equals("java02"))
                it.remove();
            sop("obj="+obj);
            }
你的移除操作和打印是没有关系的。每次读取一个next()就会打印一次。
作者: 黑马刘涛    时间: 2012-7-13 15:29
  1. while(it.hasNext())
  2.             {
  3.             Object obj=it.next(); // obj是个临时变量,暂存取到的对象
  4.             if(obj.equals("java02"))
  5.                 it.remove(); // remove操作的结果是从集合里删除了元素,但是obj保存了对象。因此遍历时仍然打印一次。
  6.             sop("obj="+obj);
  7.             }
复制代码

作者: 杨康    时间: 2012-7-13 15:34
你移除的只是从集合中的移除该元素,但是obj仍然引用"java02",所以你打印obj的话 还是有该元素的。
作者: 夏儒日    时间: 2012-7-13 15:35
集合中就没有元素的实例对象,存的都是这些对象的引用,而引用说白了就是这些对象在内存中的地址而已。
         Object obj=it.next();   //这个时候把"java02"赋给obj 了;
                 if(obj.equais("java02"))
                         it.remove();   //这只是把存放在集合中的"java02"的地址移除了而已,但内存中还是存在"java02"这个对象的
                 System.out.println("obj="+obj);//obj引用的对象是"java02",当然就能打印出来了。


作者: 李志广    时间: 2012-7-13 15:56
呵呵,谢谢你们的讲解!!!{:soso_e142:}
作者: 王双宝    时间: 2012-7-13 16:15
这问题也给技术分,我不服。{:soso_e115:}




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