详解equals()方法和hashCode()方法.docxVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
详解equals()方法和hashCode()方法 Java的基类Object供应了一些方法,其中equals()方法用于推断两个对象能否相等,hashCode()方法用于计算对象的哈希码。equals()和hashCode()都不是final方法,都可以被重写(overwrite)。 本文引见了2种方法在使用和重写时,一些需要留意的问题。 一、equal()方法 ?Object类中equals()方法实现如下: 1 2 3 public?boolean?equals(Object obj) { ????return?(this?== obj); } 通过该实现可以看出,Object类的实现接受了区分度最高的算法,即只需两个对象不是同一个对象,那么equals()肯定前往false。 虽然我们在定义类时,可以重写equals()方法,但是有一些留意事项;JDK中说明白实现equals()方法应当恪守的商定: (1)自反性:x.equals(x)必需前往true。 (2)对称性:x.equals(y)与y.equals(x)的前往值必需相等。 (3)传递性:x.equals(y)为true,y.equals(z)也为true,那么x.equals(z)必需为true。 (4)全都性:假如对象x和y在equals()中使用的信息都没有转变,那么x.equals(y)值一直不变。 (5)非null:x不是null,y为null,则x.equals(y)必需为false。 二、hashCode()方法 1、Object的hashCode() Object类中hashCode()方法的声明如下: 1 public?native?int?hashCode(); 可以看出,hashCode()是一个native方法,而且前往值类型是整形;实际上,该native方法将对象在内存中的地址作为哈希码前往,可以保证不同对象的前往值不同。 与equals()方法类似,hashCode()方法可以被重写。JDK中对hashCode()方法的作用,以及实现时的留意事项做了说明: (1)hashCode()在哈希表中起作用,如java.util.HashMap。 (2)假如对象在equals()中使用的信息都没有转变,那么hashCode()值一直不变。 (3)假如两个对象使用equals()方法推断为相等,则hashCode()方法也应当相等。 (4)假如两个对象使用equals()方法推断为不相等,则不要求hashCode()也必需不相等;但是开发人员应当生疏到,不相等的对象产生不相同的hashCode可以提高哈希表的功能。 2、hashCode()的作用 总的来说,hashCode()在哈希表中起作用,如HashSet、HashMap等。 当我们向哈希表(如HashSet、HashMap等)中添加对象object时,首先调用hashCode()方法计算object的哈希码,通过哈希码可以直接定位object在哈希表中的位置(一般是哈希码对哈希表大小取余)。假如该位置没有对象,可以直接将object插入该位置;假如该位置有对象(可能有多个,通过链表实现),则调用equals()方法比较这些对象与object能否相等,假如相等,则不需要保存object;假如不相等,则将该对象加入到链表中。 这也就解释了为什么equals()相等,则hashCode()必需相等。假如两个对象equals()相等,则它们在哈希表(如HashSet、HashMap等)中只应当消灭一次;假如hashCode()不相等,那么它们会被散列到哈希表的不同位置,哈希表中消灭了不止一次。 实际上,在JVM中,加载的对象在内存中包括三部分:对象头、实例数据、填充。其中,对象头包括指向对象所属类型的指针和MarkWord,而MarkWord中除了包含对象的GC分代年龄信息、加锁形态信息外,还包括了对象的hashcode;对象实例数据是对象真正存储的有效信息;填充部分仅起到占位符的作用, 缘由是HotSpot要求对象起始地址必需是8字节的整数倍。 三、String中equals()和hashCode()的实现 String类中相关实现代码如下: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 private?final?char?value[]; private?int?hash;?// Default to 0 public?boolean?equals(Object anObject) { ????if?(this?== anObject) { ????????return?true; ????} ????if?(an

文档评论(0)

136****7795 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档