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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© zhou_411424 黑马帝   /  2011-11-16 07:01  /  2430 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 zhou_411424 于 2011-11-28 14:29 编辑

这两天一直为这个问题困惑。
Object中的hashCode()和equals()这两个方法分别比较的是什么,‘
如果重写了Object中的这两个方法之后,又是怎样比较的呢?

评分

参与人数 1技术分 +2 收起 理由
admin + 2

查看全部评分

4 个回复

倒序浏览
网上找的:
简单介绍Object中的equals()方法和HashCode()方法:java中的String,Integer这些类已经实现了equals和HashCode方法的重写,但是Object类中并没有重写
equals():
equals()方法,在这些类中equals()方法的实现是:
public boolean equals(Object obj){
     return(this == obj);
}
HashCode()方法
比较的是两个对象的内存地址,在Object中的定义是:public native int hashCode(); <完>
说明他只是一个本地方法,要了解HashCode就要了解java中集合,一般来说分为两类,一类是List,一类是Set。前者元素有序可以重复,后者无需不能重复。在Set中有HashMap,HashSet这些方法就是保证元素的不重复性。

两者关系:
要判断两个对象是否相等,就要重写equals()方法,具体的实现网上很多。重写equals()方法一般都要重写HashCode()方法,这是为了提高存储效率,上面说的HashCode可以保证相同的元素存储于相同的地址,理论上可以没有,但是如果没有,使用效率会大大降低。比如说String实现HashCode之后,相同的对象对应的地址相同,然后在进行equals比较,里面对象都存储在堆中的String Pool里面。
希望对你有所帮助

点评

多谢了,理解一点  发表于 2011-11-16 21:32

评分

参与人数 1技术分 +2 收起 理由
admin + 2

查看全部评分

回复 使用道具 举报
HashCode()方法计算得到对象的哈希码值,系统根据这个HashCode值来决定这个对象存放到内存的什么位置。equals()方法就是用来比较两个对象是否相等的。HashCode()方法的一大作用就是在HashMap集合中的使用,如果我们希望在集合中查找是否存在某个对象,一个一个比就效率太低了,系统会调用这个对象的HashCode方法,得到其哈希码值,根据这个值来得到这个对象应该存在哪个区域里,然后就去那个区域里找有没有,没有也就说明不存在这个对象。

评分

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

查看全部评分

回复 使用道具 举报
所有的类都继承了Object中的方法。hashCode()这个函数内部里面是返回一个哈希吗值。一般来说,需要对象唯一的时候 重写这个方法,可以自定义这个方法中比较的值。  equals这个方法是比较值是否相同的,比如说人的名字是否相同。重写这个方法,可以根据自己的需求来比较两个自己有需要的属性

评分

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

查看全部评分

回复 使用道具 举报
HashSet实现了Set接口。而且也应该知道Set集合是不能包含重复元素的。那么怎么判断要add的对象是否是重复的元素呢?这就是用hashCode()方法判断的。hashCode()是Object类的方法(equals()方法也是),所有类都间接或直接继承了Object类,因此都继承了hashCode()方法。Object类的hashCode()方法的返回值以整数形式表示一个对象的地址(未必是真正的地址,通过某种转换表示这个地址而已),即当调用HashSet的add(Object a)时,将a的hashCode值(直接说成hashCode值)与已有元素的hashCode值进行比较,如果不同则直接加进去,如果hashCode值相同则接着调用equals方法比较,如果equals方法返回真则不加,返回true则加进去。
如果不重写这两个方法,子类都将直接继承Object的两个方法,即会直接比较两个对象的地址。这在实际项目开发中意义较少的,一般情况下都会希望以内容来判断时候能加进去(即add)。
比如当
People a = new People("zhangsan");
People b = new People("zhangsan");
set.add(a);
set.add(b);
这个时候,如果不重写hashCode方法的话,a和b两个对象都可以加进去的,因为直接继承Object类的,hashCode方法,即比较两个地址。而两个对象的地址肯定是不一样的。
而我们希望的是以name(People的一个成员变量)来判断是否能加进去(比如实际项目中希望存名字不一样的人),这个时候就需要重写hashCode方法来实现这个功能了。就是让上面的set.add(b)不能加进去,因为名字同样是张三的对象,加进去没用。。。大概这些意思吧(说的比较啰嗦,希望你能体会)
对了一般重写hashCode方法的时候也会重写equals方法,反之也成立。

点评

嗯,很详细,多谢了!  发表于 2011-11-17 06:42

评分

参与人数 1技术分 +2 收起 理由
admin + 2 赞一个!

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马