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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 攻城狮 黑马帝   /  2012-3-19 21:53  /  3053 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

class Person
{
        private String name;
        private int age;
        Person(String name,int age)
        {
                this.name = name;
                this.age = age;
        }        
        public boolean equals(Object obj)
        {
                if(!(obj instanceof Person))//判断obj是否是person实例
                        return false;
                Person p = (Person)obj;//向下强转,以便于调用person特有方法
                //System.out.println(this.name+"....."+p.name);
                return this.name.equals(p.name) && this.age == p.age;
        }
        public String getName()
        {
                return name;
        }
        public int getAge()
        {
                return age;
        }
}
class ArrayListTest2
{
        public static void main(String[] args)
        {
                ArrayList al = new ArrayList();

                al.add(new Demo());
                al.add(new Person("lisi01",30));//al.add(Object obj);//Object obj = new Person("lisi01",30);
                al.add(new Person("lisi02",32));
                al.add(new Person("lisi02",32));
                al.add(new Person("lisi04",35));
                al.add(new Person("lisi03",33));
                al.add(new Person("lisi04",35));               
                al = singleElement(al);
                //sop("remove 03 :"+al.remove(new Person("lisi03",33)));//remove方法底层也是依赖于元素的equals方法。
                for (Iterator it = al.iterator(); it.hasNext(); )//遍历集合 打印人的姓名和年龄
                {
                        Person p = (Person)it.next();
                        sop(p.getName()+"::"+p.getAge());
                }
        }
        public static ArrayList singleElement(ArrayList al)
        {
                //定义一个临时容器。
                ArrayList newAl = new ArrayList();

                Iterator it = al.iterator();

                while(it.hasNext())
                {
                        Object obj = it.next();

                        if(!newAl.contains(obj))
                                newAl.add(obj);
                }

                return newAl;
        }
        public static void sop(Object obj)
        {
                System.out.println(obj);
        }
}

我上面标注的理解大致运行过程对么?contains 自动调用equals方法?为什么?

评分

参与人数 1技术分 +1 收起 理由
房宝彬 + 1

查看全部评分

5 个回复

倒序浏览
我认为你的理解是对的,容器类中对容器中存储的元素进行增删改查操作时均自动调用equals方法
回复 使用道具 举报
public boolean contains(Object o)如果此列表中包含指定的元素,则返回 true。更确切地讲,当且仅当此列表包含至少一个满足 (o==null ? e==null : o.equals(e)) 的元素 e 时,则返回 true。

上面是查看API 里contains方法说明里面的说明,当前对象标示为e,传递的参数对象标示为o,
也就是说首先判断o是否为空,为空则返回e==null的结果,
o不为空,则返回o.equals(e)的结果。
也就是说当传递的参数o不为空的时候就会调用equals方法,你这里可以把第③步的obj=null来进行验证。

评分

参与人数 1技术分 +1 收起 理由
房宝彬 + 1

查看全部评分

回复 使用道具 举报
没错,contains的方法底层就是调用equals的。而这里你的equals的方法重写了,就可以判断了
如果在发现具体,你会发现Object的equals的底层是调用==的,所以我们要经常重写equals的方法了
回复 使用道具 举报
对于  al = singleElement(al);①   
改成:ArrayList al2 = singleElement(al);
原因:singleElement(al)返回的是一个ArrayList对象,所以需要声明一个al2 来接收返回来的对象;
回复 使用道具 举报
OMG 发表于 2012-3-20 00:37
对于  al = singleElement(al);①   
改成:ArrayList al2 = singleElement(al);
原因:singleElement(al) ...

..从头到尾就一个al,相当于就是对他自己去掉重复的元素再赋给他自己 为什么要另外再定义一个呢
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马