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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 田建 高级黑马   /  2012-6-5 16:44  /  1735 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 田建 于 2012-6-6 10:29 编辑

import java.util.*;
class IteratorDemo
{
        public static void main(String[] args)
        {
                ArrayList al=new ArrayList();
                al.add("nihao1");
                al.add("nihao2");
                al.add("nihao3");
                Iterator it=al.iterator();
                while(it.hasNext())
                {
                        Object obj=it.next();
                        if(obj.equals("nihao3"))
                                it.remove();//迭代过程中若obj等于“nihao3”,即删除
                        System.out.println("obj="+obj);//那为什么打印的时候还是在里面呢?
                }
                System.out.println(al);
        }
}

评分

参与人数 1技术分 +1 收起 理由
袁錦泰 + 1

查看全部评分

7 个回复

倒序浏览
obj是Object对象,“nihao3”是String对象,他们怎么可能相等
你将Object obj=it.next();改成String str = (String)it.next();
应该暂时能得到你想要的效果
具体的==和equals到底有什么区别,还有remove到底是原理是怎么样的,还希望你能仔细的看毕向东老师的java基础,里面讲的很清楚的
回复 使用道具 举报
obj和“nihao3”的类型不一样。应该把obj强制转换为String类型。
回复 使用道具 举报
这其实是变量生命周期的问题
你执行这句代码 Object obj=it.next();
首先是在obj指向了内存中的it.next()的对象
当你执行了remove()方法后,内存中的数据并没有被垃圾回收机制回收掉,只有结束本次循环,obj的生命周期才会结束
所以你在循环周再次打印obj的时候还是原来的值。

回答完毕。over~
回复 使用道具 举报
我的jdkjdk1.7.0_03版本,运行结果就没有了nihao3
但是编译时有提示,只是没有使用泛型的提示。
Iterator中,Iterator接口有三个方法,next() hasNext() remove(),只要是iterator自己的remove就可以删除元素的。
老师讲的原则:在迭代时,只能使用迭代器中的方法操作集合中的元素,不可以通过该集合对象的方法操作,Iterator中,只能对元素进行判断,取出和删除操作,如果要对元素进行修改,就需要其子接口,ListIterator来完成。
/演示列表迭代器ListIterator
Class ListDemo
public static void main(String[] args)
       {
              //演示列表迭代器。
              ArrayList al = new ArrayList();
              //添加元素
              al.add("java01");
              al.add("java02");
              al.add("java03");
              sop(al);
              ListIterator li = al.listIterator();
              while(li.hasNext())
              {
                     Object obj = li.next();
                     if(obj.equals("java02"))
                            li.add("java009");
                            li.set("java006");
              }

QQ截图20120605173614.png (4.5 KB, 下载次数: 18)

QQ截图20120605173614.png
回复 使用道具 举报
本帖最后由 李天甲 于 2012-6-5 18:20 编辑

我来回答一下呵呵,老方法,请看代码中的注释
  1. import java.util.*;
  2. class IteratorDemo
  3. {
  4.     public static void main(String[] args)
  5.     {
  6.         ArrayList al=new ArrayList();
  7.         al.add("nihao1");
  8.         al.add("nihao2");
  9.         al.add("nihao3");
  10.         Iterator it=al.iterator();
  11.         while(it.hasNext())
  12.         {
  13.             Object obj=it.next(); //这个Obj中你存的是it.next()返回的元素
  14.             if(obj.equals("nihao3")){
  15.                 it.remove();//迭代过程中若obj等于“nihao3”,即删除
  16.                 //现在这个时候,al里面的"nihao3"已经没了
  17.                 //你输出的这个,是obj里面的"nihao3"....
  18.                 //如果你想让这个东西不输出,这样做不就行了
  19.                 obj=null;
  20.             }
  21.             System.out.println("obj="+obj);//那为什么打印的时候还是在里面呢?
  22.         }
  23.         System.out.println(al);
  24.     }
  25. }
复制代码
你将迭代器的指向的元素删掉了,但是用的临时变量obj中的值还在啊.这跟你删不删指向的元素没啥关系呵呵.
如果你真想删掉,上边我把它给设置成null了..呵呵

评分

参与人数 1技术分 +1 收起 理由
袁錦泰 + 1

查看全部评分

回复 使用道具 举报
Object obj=it.next();
if(obj.equals("nihao3"))
it.remove();//迭代过程中若obj等于“nihao3”,即删除
System.out.println("obj="+obj);//那为什么打印的时候还是在里面呢?

这个问题毕老师已经讲了啊
it.remove()虽然删除了"nihao3"了元素,但是obj还在使用,所以打印了出来,下次next的时候就没了;
回复 使用道具 举报
像你那样,就算删除了,下面的这个输出语句还是要执行,其实已经移除了。
你可以好好看看if语句。
应该改为这样:
import java.util.*;
class IteratorDemo
{
        public static void main(String[] args)
        {
                ArrayList al=new ArrayList();
                al.add("nihao1");
                al.add("nihao2");
                al.add("nihao3");
                Iterator it=al.iterator();
                while(it.hasNext())
                {
                        Object obj=it.next();
                        if(obj.equals("nihao3"))
                        {
                                it.remove();//迭代过程中若obj等于“nihao3”,即删除
                        }
                        else
                        {
                                System.out.println("obj="+obj);//那为什么打印的时候还是在里面呢?
                        }
                                
                        
                }
                System.out.println(al);
        }
}

评分

参与人数 1技术分 +1 收起 理由
袁錦泰 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马