黑马程序员技术交流社区
标题: 关于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 |