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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© ~IN_HAND~ 中级黑马   /  2013-10-27 13:50  /  1044 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 ~IN_HAND~ 于 2013-10-27 23:50 编辑

并不是什么大问题,但是我始终没搞明白。。。下面这个程序是利用ArrayList集合不断增加元素,重复的元素要筛选掉。

废话不多说,直接上代码import java.util.*;
class ArrayListTest0
{
        public static void main(String[] args)
        {
                ArrayList a1 = new ArrayList();
                a1.add(new Person("jia",23));
                a1.add(new Person("jia",22));
                a1.add(new Person("zheng",22));
                a1.add(new Person("jia",23));

                a1 = singleElements(a1);
                //问题就出在这个地方了,调用此方法,在程序的输出结果中就会输出Person类中equals方法中的那句话,
                //但是,令我费解的是,如果不调用此方法的话,为什么就不调用equals方法了呢?输出中没有啊?!
                //我对equals的理解,集合在增加元素时会调用equals方法,我理解错了吗?


                Iterator it = a1.iterator();
                while(it.hasNext())
                {
                        Person p = (Person)it.next();
                        String name = p.getName();
                        int age = p.getAge();
                        System.out.println("name: "+name+"  "+"age: "+age);
                }
        }

        public static ArrayList singleElements(ArrayList list)
        {
                ArrayList ls = new ArrayList();
                Iterator it = list.iterator();
                while(it.hasNext())
                {
                        Object obj = it.next();
                        if(!ls.contains(obj))
                                ls.add(obj);
                }
                return ls;
        }
}
class Person
{
        private String name;
        private int age;
        public Person(String name,int age)
        {
                this.name = name;
                this.age = age;
        }
        public String getName()
        {
                return name;
        }
        public int getAge()
        {
                return age;
        }
        
        public boolean equals(Object obj)
        {
                if(!(obj instanceof Person))
                        return false;
                Person p = (Person)obj;
                System.out.println(this.name+"......."+p.name);
                return this.name.equals(p.name) && this.age == p.age;
        }
}


求高人指点迷津!!!




评分

参与人数 1技术分 +1 收起 理由
乔兵 + 1

查看全部评分

5 个回复

倒序浏览
没错,最关键的一步i大概没写出来
就是元素的类要覆写equals()方法,自定义元素比较的标准,否则equals()使用的则是继承Object类的,比较内存地址值
回复 使用道具 举报
Jim-剣◆﹏ 发表于 2013-10-27 14:00
没错,最关键的一步i大概没写出来
就是元素的类要覆写equals()方法,自定义元素比较的标准,否则equals()使 ...

不好意思,刚才由于编辑问题,代码没贴全,您再看看
回复 使用道具 举报
首先ArrayList这个集合是可以存放重复的元素的在调用add方法时是不会调用被添加元素的equals方法的(你可以对比下和set集合的区别)。那么equals是在哪调用的呢?看上面代码有一段: public static ArrayList singleElements(ArrayList list)
        {
                ArrayList ls = new ArrayList();
                Iterator it = list.iterator();
                while(it.hasNext())
                {
                        Object obj = it.next();
                        if(!ls.contains(obj))
                                ls.add(obj);
                }
                return ls;
        }
}
这里面的contain里面调用了参数传递的对象的equals方法和ls集合里面的元素进行对比。建议你补一下集合的内容。

评分

参与人数 1技术分 +1 收起 理由
周志龙 + 1 赞一个!

查看全部评分

回复 使用道具 举报
linjl_ll 发表于 2013-10-27 14:25
首先ArrayList这个集合是可以存放重复的元素的在调用add方法时是不会调用被添加元素的equals方法的(你可以 ...

原来如此!!主要是刚开始一直不明白到底是哪句代码执行时调用了equals方法。好了,明白了。
哥们儿~谢啦!
回复 使用道具 举报
To 金牌黑马 2013-10-27 16:44:41
地板
楼主你好,如果问题已解决请将帖子状态修改为提问结束,
如果未解决请继续追问,谢谢合作
修改方法请看解释帖:http://bbs.itheima.com/thread-89313-1-1.html
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马