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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 杨华威 中级黑马   /  2012-3-29 09:35  /  3108 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 杨华威 于 2012-3-29 09:37 编辑

/*
将自定义对象作为元素存到ArrayList集合中。并去除重复元素。
比如:存入人对象。同姓名同年龄,视为同一个人,为重复元素。

思路:
1,对人进行描述。将数据封装进对象。
2,定义容器,将人存入。
3.取出

List集合判断元素是否相同,移除元素,依据的是元素的equals方法。

可是,关于重写equals方法,感觉很难理解?谁能解释一下?*/


import java.util.*;
class Person
{
        private String name;
        private int age;
        Person(String name,int age)
        {
                this.name = name;
                this.age = age;
        }
        public boolean equals(Object obj)  // 不理解这一部分……重写equals?
        {
                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;

        }
       
               public String getName()
        {
                return name;
        }
        public int getAge()
        {
                return age;
        }
}

class  ArrayListTest2
{
        public static void sop(Object o)
        {
                System.out.println(o);
        }
        public static void main(String[] args)
        {
                ArrayList al = new ArrayList();
                al.add(new Person("weiwei001",20));//al.add(Object obj); Object obj = new Person("weiwei001",24);
                al.add(new Person("weiwei002",22));
                al.add(new Person("weiwei002",22));
                al.add(new Person("weiwei003",23));
                al.add(new Person("weiwei001",20));
                al.add(new Person("weiwei004",20));
               
                al = singleElement(al);
                //sop("remove"+al.remove(new Person("weiwei003",23)));//都是使用equals方法进行比较的。
                Iterator it = al.iterator();
                while(it.hasNext())
                {
                        Person p = (Person)it.next();
                        sop(p.getName()+":"+p.getAge());
                }
        }

        public static ArrayList singleElement(ArrayList al)
        {
                ArrayList Al = new ArrayList();
                Iterator it = al.iterator();

                while(it.hasNext())
                {
                        Object obj = it.next();
                        if (!Al.contains(obj))//contains的判断就是使用equals()方法。
                        {
                                Al.add(obj);
                        }
                }
                return Al;
        }
}

5 个回复

倒序浏览
本帖最后由 马云 于 2012-3-29 09:54 编辑

听我娓娓道来:
public boolean equals(Object obj)  // 不理解这一部分……重写equals?
        {
                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;

        }   
先说黑马的服务器真该换换了,正写着就打不开了。

list保证元素的唯一性是调用的equals方法。也就是说在你往list.add()的时候系统会去调用list的equals方法,把add的这个元素和原来的原素进行比较,如果不重写这个方法,传进来的每个元素都是一个对象,那么它们就是不相等的,所以为了元素的维一性要重写equals方法,把传进来 的对象拆出元素来进行比较,
下面解释每一行
if (!(obj instanceof Person))这句判断传进来的是不是Person类型的如果不是就没什么可比性了,直接返回false

Person p = (Person)obj;
由于传进来的是object类型的所以要比较它们的元素要转换成相同的类型,
return this.name.equals(p.name)&&this.age==p.age;
返回这里调用的是name(是一个string)的equals方法,因为字符串重写了这个方法它两个比较的就是值,
this.age==p.age;
这里比较这两个int值,如果这两个值都相等了就返回true说明是一个对象,如果返回false就不是一个,就能够放进集合里了。
回复 使用道具 举报
return this.name.equals(p.name)&&this.age==p.age 这句话就是说,名字和年龄都相同时,返回0,元素对象视为相同,重写完这个equals方法后,相同元素就存不进去了
回复 使用道具 举报
马云 发表于 2012-3-29 09:41
听我娓娓道来:
public boolean equals(Object obj)  // 不理解这一部分……重写equals?
        {

哦……再看一遍。再看一遍,似乎慢慢明白了点
回复 使用道具 举报
对于存放自定义类型对象时,需要自己定义相同元素的判定方法,所以要覆写equals方法。
回复 使用道具 举报
这段代码的目的就是要保证传进来的对象是Person,重写equals()方法的就是要判断传进来的对象是不是符合要求的! 我也是刚学就只能理解到这里了!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马