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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 周怡 中级黑马   /  2013-1-28 16:17  /  1711 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

在学习HashMap的时候,遇到的hashCode和equals方法不太明白,请大家来说说这两个方法。

8 个回复

倒序浏览
 Map接口中由于作为key的对象将通过计算其散列函数来确定与之对应的value的位置,因此任何作为key的对象都必须实现hashCode和equals方法。hashCode和equals方法继承自根类Object,如果你用自定义的类当作key的话,要相当小心,按照散列函数的定义,如果两个对象相同,即obj1.equals(obj2)=true,则它们的hashCode必须相同,但如果两个对象不同,则它们的hashCode不一定不同,如果两个不同对象的hashCode相同,这种
现象称为冲突,冲突会导致操作哈希表的时间开销增大,所以尽量定义好的hashCode()方法,能加快哈希表的操作。
  如果相同的对象有不同的hashCode,对哈希表的操作会出现意想不到的结果(期待的get方法返回null),要避免这种问题,只需要牢记一条:要同时复写equals方法和hashCode方法,而不要只写其中一个。

评分

参与人数 1技术分 +1 收起 理由
冯海霞 + 1

查看全部评分

回复 使用道具 举报
本帖最后由 yong230 于 2013-1-28 16:35 编辑

散列函数hasCode()保证了加入Map集合中的对象的key是不同的
回复 使用道具 举报
本帖最后由 yong230 于 2013-1-28 16:36 编辑

不好意思,网速太慢,表单重复提交了
回复 使用道具 举报
hashCode方法一般用户无法调用,是程序自己调用的,用来生成对象的哈希码,哈希码相等的对象存在一个区域内,哈希码相等equals并不一定相等。
equals方法可以用户自己调用,主要用于哈希码相等对象的比较,如果不复习默认是继承Object类,默认比较的是地址值。复习equals后应该比较的是两个对象的内容。

评分

参与人数 1技术分 +1 收起 理由
冯海霞 + 1

查看全部评分

回复 使用道具 举报
Java对于eqauls方法和hashCode方法是这样规定的:1、如果两个对象相同,那么它们的hashCode值一定要相同;2、如果两个对象的hashCode相同,它们并不一定相同,上面说的对象相同指的是用eqauls方法比较。就是说equals()相等的两个对象,hashcode()一定相等;  equals()不相等的两个对象,却并不能证明他们的hashcode()不相等。换句话说,equals()方法不相等的两个对象,hashcode()有可能相等

评分

参与人数 1技术分 +1 收起 理由
冯海霞 + 1

查看全部评分

回复 使用道具 举报
孔斌 中级黑马 2013-1-29 18:12:17
7#
在Java中,equals()和hashCode()两个函数的一般的使用是紧密配合的。在多数情况下,这两个函数是不用考虑的,直接使用它们的默认设计就可以了。但是在一些情况下,这两个函数最好是自己设计,才能确保整个程序的正常运行。
equals()相等的两个对象,hashcode()一定相等;
equals()不相等的两个对象,却并不能证明他们的hashcode()不相等。换句话说,equals()方法不相等的两个对象,hashcode()有可能相等。(我的理解是由于哈希码在生成的时候产生冲突造成的)
更加详细的介绍请参看我的博客:
http://xiaobin66.blog.163.com/blog/static/21590301820130296649459/

评分

参与人数 1技术分 +1 收起 理由
冯海霞 + 1

查看全部评分

回复 使用道具 举报
念满 中级黑马 2013-1-29 18:24:07
8#
两个方法都间接继承自Object;HashMap:hashCode()返回此映射的哈希码值;equals(Object obj)比较指定的对象与此映射是否相等.

集合通常用来存储对象,若想保证HashMap存储元素唯一,通常要覆盖上面2个方法。
有人说覆盖equals方法就可以了啊;是可以(如ArrayList集合),但是效率低,试想每个元素都要用自己的equals去与之前元素的equals
方法比较,繁琐而又复杂;于是java先贤想了个办法,先比较元素的hashCode,若hashCode相同则再比较equals,这涉及到数据底层设计。

其实HashMap数据表结构是哈希表结构,集合分成若干个存储区域,每个对象可以计算一个哈希码,哈希码分组,每组分别对应某个存储区域;
查找某个对象时,JAVA首先获得对象的哈希吗,然后找到相应的存储区域,取出存储区域的每个元素与该对象进行equals比较

通常来说,一个类的两个实例对象用equals方法比较的结果相等时,hashcode必相等,反之则不成立

评分

参与人数 1技术分 +1 收起 理由
冯海霞 + 1

查看全部评分

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