黑马程序员技术交流社区
标题:
hashCode()方法和equals()方法
[打印本页]
作者:
周怡
时间:
2013-1-28 16:17
标题:
hashCode()方法和equals()方法
在学习HashMap的时候,遇到的hashCode和equals方法不太明白,请大家来说说这两个方法。
作者:
yong230
时间:
2013-1-28 16:29
Map接口中由于作为key的对象将通过计算其散列函数来确定与之对应的value的位置,因此任何作为key的对象都必须实现hashCode和equals方法。hashCode和equals方法继承自根类Object,如果你用自定义的类当作key的话,要相当小心,按照散列函数的定义,如果两个对象相同,即obj1.equals(obj2)=true,则它们的hashCode必须相同,但如果两个对象不同,则它们的hashCode不一定不同,如果两个不同对象的hashCode相同,这种
现象称为冲突,冲突会导致操作哈希表的时间开销增大,所以尽量定义好的hashCode()方法,能加快哈希表的操作。
如果相同的对象有不同的hashCode,对哈希表的操作会出现意想不到的结果(期待的get方法返回null),要避免这种问题,只需要牢记一条:要同时复写equals方法和hashCode方法,而不要只写其中一个。
作者:
yong230
时间:
2013-1-28 16:29
本帖最后由 yong230 于 2013-1-28 16:35 编辑
散列函数hasCode()保证了加入Map集合中的对象的key是不同的
作者:
yong230
时间:
2013-1-28 16:30
本帖最后由 yong230 于 2013-1-28 16:36 编辑
不好意思,网速太慢,表单重复提交了
作者:
刘军亭
时间:
2013-1-28 17:25
hashCode方法一般用户无法调用,是程序自己调用的,用来生成对象的哈希码,哈希码相等的对象存在一个区域内,哈希码相等equals并不一定相等。
equals方法可以用户自己调用,主要用于哈希码相等对象的比较,如果不复习默认是继承Object类,默认比较的是地址值。复习equals后应该比较的是两个对象的内容。
作者:
赵文迪
时间:
2013-1-29 18:05
Java对于eqauls方法和hashCode方法是这样规定的:1、如果两个对象相同,那么它们的hashCode值一定要相同;2、如果两个对象的hashCode相同,它们并不一定相同,上面说的对象相同指的是用eqauls方法比较。就是说equals()相等的两个对象,hashcode()一定相等; equals()不相等的两个对象,却并不能证明他们的hashcode()不相等。换句话说,equals()方法不相等的两个对象,hashcode()有可能相等
作者:
孔斌
时间:
2013-1-29 18:12
在Java中,equals()和hashCode()两个函数的一般的使用是紧密配合的。在多数情况下,这两个函数是不用考虑的,直接使用它们的默认设计就可以了。但是在一些情况下,这两个函数最好是自己设计,才能确保整个程序的正常运行。
equals()相等的两个对象,hashcode()一定相等;
equals()不相等的两个对象,却并不能证明他们的hashcode()不相等。换句话说,equals()方法不相等的两个对象,hashcode()有可能相等。(我的理解是由于哈希码在生成的时候产生冲突造成的)
更加详细的介绍请参看我的博客:
http://xiaobin66.blog.163.com/blog/static/21590301820130296649459/
作者:
念满
时间:
2013-1-29 18:24
两个方法都间接继承自Object;HashMap:hashCode()返回此映射的哈希码值;equals(Object obj)比较指定的对象与此映射是否相等.
集合通常用来存储对象,若想保证HashMap存储元素唯一,通常要覆盖上面2个方法。
有人说覆盖equals方法就可以了啊;是可以(如ArrayList集合),但是效率低,试想每个元素都要用自己的equals去与之前元素的equals
方法比较,繁琐而又复杂;于是java先贤想了个办法,先比较元素的hashCode,若hashCode相同则再比较equals,这涉及到数据底层设计。
其实HashMap数据表结构是哈希表结构,集合分成若干个存储区域,每个对象可以计算一个哈希码,哈希码分组,每组分别对应某个存储区域;
查找某个对象时,JAVA首先获得对象的哈希吗,然后找到相应的存储区域,取出存储区域的每个元素与该对象进行equals比较
通常来说,一个类的两个实例对象用equals方法比较的结果相等时,hashcode必相等,反之则不成立
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2