黑马程序员技术交流社区

标题: 关于hash数据结构的重写equals方法的疑问 [打印本页]

作者: 黑马-王燚    时间: 2012-10-4 17:57
标题: 关于hash数据结构的重写equals方法的疑问
class  Monkey
{
        private String name;
        private int age;
        public String getName() {
                return name;
        }
        public void setName(String name) {
                this.name = name;
        }
        public int getAge() {
                return age;
        }
        public void setAge(int age) {
                this.age = age;
        }
       
        Monkey(String name,int age)
        {
                this.name=name;
                this.age=age;
        }
       
        //由于题目需求:复写 hashCode 和  equals方法
        public int hashCode()
        {   
                //是不允许年龄和名字完全相同
                return this.name.hashCode()+this.age*31;
        }
        public boolean equals(Object obj)  //这样写是为了通用,为了适用于各种集合
        {
                if(!(obj instanceof Monkey))  //类型不对就直接抛出异常
                        //手动抛出异常
                        throw new ClassCastException("类型不匹配!");
                Monkey mon=(Monkey)obj;
               
                //符合条件返回true(为同一个对象)  不符合返回false(不是同一个对象)  
                return this.name.equals(mon.name)&&(this.age==mon.age);
        }
       
}

请教一下各位大神,这个this.name 和 mon.name 分别代表的是什么 ,请解释的具体些!
作者: 古银平    时间: 2012-10-4 18:01
return this.name.equals(mon.name)&&(this.age==mon.age);里的this.name是集合中已经有的对象的属性值,如果集合中还没有对象,则this.name=null,
mon.name是要往集合中存的对象的属性name。
作者: 夏天    时间: 2012-10-4 18:40
本帖最后由 夏诗瑶 于 2012-10-4 18:49 编辑

首先你得明白覆写的原因:
//
覆写hashCode方法的原因。Object中的hashCode是本地(windows)方法,只算内存地址.
//不覆写会根据内存地址判断资料相同的人不是同一个人。
//满足不了人的姓名和年龄相同 既为同一个人的要求。所以要依据对象自身特别不同。
//覆写equals的原因:HashSet判断元素唯一的依据是自动调用equals方法。
//不覆写的话,如果hash值万一相同的话,就需要逐个比较元素的属性,而原来的equals满足不了这个要求


// 符合条件返回true(为同一个对象) 不符合返回false(不是同一个对象)
  return this.name.equals(mon.name) && (this.age == mon.age);

这两句话,比如你开始添加了一个 对象("monkey1",25); 当你再添加一个对象("monkey1",25); 的时候,
首先根据你自己覆写的hascode方法判断出 两个hascode值相同,这时就要通过equals方法来判断了。
this代表后面一个monkey1对象。mon.name其实是之前传递的每一个对象(hascode相同的对象)。
也就是说,当你每添加一个对象时,当hascode值相等时,系统都会跟以前的进行比较,从而区分你添加的到底是不是同一个对象!

作者: 胡川    时间: 2012-10-4 19:02
说简单点 ,this.name' 就是你准备拿去比较的对象  mon.name 就是 你要拿this.name 去和谁比较 的对象。相比之下 mon.name 是楼上所说 你已经添加的对象。this.name 是你添加的新对象。




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