黑马程序员技术交流社区

标题: 关于集合中的删除元素的问题 [打印本页]

作者: 黄昆    时间: 2012-6-14 19:11
标题: 关于集合中的删除元素的问题
本帖最后由 hkylp 于 2012-7-1 09:09 编辑

class list
{
        public static void main(String[] args)
        {
         ArrayList al=new ArrayList();
         al.add("java01");
         al.add("java02");
         al.add("java03");
         System.out.println(al);
         Iterator it=al.iterator();
         while(it.hasNext())
         {
                Object obj=it.next();
                 if(obj.equais("java02"))
                         it.remove();
                 System.out.println("obj="+obj);
         }
           System.out.println(al);
        }
}
为什么obj的打印结果是:java01 java02 java03呀?java02的引用从集合中删除和java02元素从集合中删除有什么区别呀?关于引用我特迷糊,希望兄弟们帮我好好分析一下。
作者: 李盼    时间: 2012-6-14 19:22
本帖最后由 李盼 于 2012-6-14 19:23 编辑

class Test
{
        public static void main(String[] args)
        {
         ArrayList al=new ArrayList();
         al.add("java01");
         al.add("java02");
         al.add("java03");
         System.out.println(al);
         Iterator it=al.iterator();
         while(it.hasNext())
         {
                Object obj=it.next();
                 if(obj.equals("java02"))
                         it.remove();
                 System.out.println("obj="+obj);
         }
           System.out.println(al);
        }
}
最后打印的结果是
[java01, java02, java03]
obj=java01
obj=java02
obj=java03
[java01, java03]

java02确实被移除了!另说明楼主的equals书写有误。还有集合中存放的都是对象的引用,不会存放对象本身,所以删除的也是对象的引用,不存在删除对象本身!
作者: 晏文根    时间: 2012-6-14 19:26
其实这个你应该重写下equals方法,如果你没有重写equals方法,它的作用是与“==”一样,比较的是对象引用地址是否相等。
而你加入的每一个字符串的是不同的对象,当然引用地址不同哦!
你可以重写equals
public boolean equals(String str)
{
return this.compareTo(str);
}
作者: 胡大强    时间: 2012-6-14 19:27
所谓引用,其实就是某一个变量的一个别名,所以数组是没有引用的。。当初我们的C语言老师好像讲过。譬如:int i; int &a=i; 定义了引用a,即变量i 的别名!
作者: 揭耀祖    时间: 2012-6-14 23:12
集合中就没有元素的实例对象,存的都是这些对象的引用,而引用说白了就是这些对象在内存中的地址而已。
         Object obj=it.next();   //这个时候把"java02"赋给obj 了;
                 if(obj.equais("java02"))
                         it.remove();   //这只是把存放在集合中的"java02"的地址移除了而已,但内存中还是存在"java02"这个对象的
                 System.out.println("obj="+obj);//obj引用的对象是"java02",当然就能打印出来了。






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