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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 常佳杰 中级黑马   /  2012-7-5 13:08  /  2266 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 常佳杰 于 2012-7-5 17:42 编辑

在object类中,hashcode()方法是本地方法,返回的是对象的引用(地址值),而object类中的equals()方法比较的也是两个对象的引用(地址值),
hashcode()不等,一定能推出equals()也不等
equals()相等,hashcode()也就相等
这个有点迷糊,不都是比较的引用地址吗?

2 个回复

倒序浏览
hashcode是根据对象的地址值计算出来的,并不是地址本身。
Object类中的equals比较的是两个对象的地址值,一般需要程序员重写
hashcode相同的对象,不一定equals,但是如果两个对象equals,那么他们的hashcode必须相同。
当对象需要存入HashSet或HashTable这些底层用到哈希值的集合中时,hashcode方法才有意义,此方法是为了提高检索的效率。
一旦一个对象存入了HashSet或HashTable中之后,就不可再改变其参与计算hashcode的字段了

关于这点的详细内容,你可以看“张孝祥java高新技术第26讲”,里面讲的很详细
回复 使用道具 举报
java中的equals()方法和hashCode()方法详解
equals()和hashCode()方法是用来同一类做比较用的,尤其是在容器里如set存放同一类对象时用来判断放入的对象是否重复。
equals()相等的两个对象,hashcode()一定相等,equals()不相等的两个对象,却并不能证明他们的hashcode()不相等。换句话说,equals()方法不相等的两个对象,hashcode()有可能相等。(我的理解是由于哈希码在生成的时候产生冲突造成的)
在这里hashCode就好比字典里每个字的索引,equals()好比比较的是字典里同一个字下的不同词语。就好像在字典里查“自”这个字下的两个词语“自己”、“自发”,如果用equals()判断查询的词语相等那么就是同一个词语,比如equals()比较的两个词语都是“自己”,那么此时hashCode()方法得到的值也肯定相等;如果用equals()方法比较的是“自己”和“自发”这两个词语,那么得到结果是不想等,但是这两个词都属于“自”这个字下的词语所以在查索引时相同,即:hashCode()相同。如果用equals()比较的是“自己”和“他们”这两个词语的话那么得到的结果也是不同的,此时hashCode() 得到也是不同的。
反过来:hashcode()不等,一定能推出equals()也不等;hashcode()相等,equals()可能相等,也可能不等。在object类中,hashcode()方法是本地方法,返回的是对象的地址值,而object类中的equals()方法比较的也是两个对象的地址值,如果equals()相等,说明两个对象地址值也相等,当然hashcode() 也就相等了;

评分

参与人数 1技术分 +1 收起 理由
蒋映辉 + 1

查看全部评分

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