文档章节

effective java读书笔记9:覆盖equals方法时总要覆盖hashcode

silence88
 silence88
发布于 2017/01/21 17:00
字数 598
阅读 6
收藏 0

解读:延续上一点讲的,复写equals方法同时也要复写hashcode方法,保证相等的对象hashcode值也相等的约定,从而保证基于散列的集合正常运行(HashMap、HashSet、HashTable等)。

  • 关于hashcode在Jdk文档上的说明
public int hashCode()

返回该对象的哈希码值。支持此方法是为了提高哈希表(例如 java.util.Hashtable 提供的哈希表)的性能。

hashCode 的常规协定是:

  • 在 Java 应用程序执行期间,在对同一对象多次调用 hashCode 方法时,必须一致地返回相同的整数,前提是将对象进行 equals 比较时所用的信息没有被修改。从某一应用程序的一次执行到同一应用程序的另一次执行,该整数无需保持一致。
  • 如果根据 equals(Object) 方法,两个对象是相等的,那么对这两个对象中的每个对象调用 hashCode 方法都必须生成相同的整数结果。
  • 如果根据 equals(java.lang.Object) 方法,两个对象不相等,那么对这两个对象中的任一对象上调用 hashCode 方法 要求一定生成不同的整数结果。但是,程序员应该意识到,为不相等的对象生成不同整数结果可以提高哈希表的性能。

实际上,由 Object 类定义的 hashCode 方法确实会针对不同的对象返回不同的整数。(这一般是通过将该对象的内部地址转换成一个整数来实现的,但是 JavaTM 编程语言不需要这种实现技巧。)

  • 如何编写hashcode方法

理想的情况下,hashcode方法应该是把集中不相等的实例均匀分布到所有可能的散列值上,通常情况下没必要自己去编写hashcode方法,一般IDE都会提供自动帮你生成hashcode的方法,但是不推荐使用。另一种方式是依赖第三方:Apache commons HashcodeBuilder。

总结:关于hashcode的编写细节不做仔细研究,重点搞清楚为什么要编写此方法,然后借助第三方在需要的情况下提供此方法。

注:关于如何生成hashcode方法参考:http://www.importnew.com/8189.html

© 著作权归作者所有

silence88
粉丝 8
博文 71
码字总数 72855
作品 0
深圳
程序员
私信 提问
理解 equals(),hashcode()和 ==

这里分别讲==和equals()的关系,以及equals()和hashcode()的关系 讲解之前,需要先明白对象的内容、对象的引用,基本类型,引用类型这几个概念,此处不做解释 一、==和equals() 两者都是比较...

Bour
2018/08/04
0
0
《Effective Java》—Java进阶必备

《Effective Java》是 Java 领域的经典之作,其影响力不亚于《Think in Java》。它是每个 Java 开发者的必读书籍,值得多次阅读品味,并不断实践其中的经验技巧。 两年前读过此书,当时自身技...

落英坠露
01/17
0
0
Effective_Java_Index

基于《Effective Java 第三版》的读书笔记 创建和销毁对象 第1条:用静态工厂方法代替构造器 第2条:遇到多个构造参数时要考虑用构建器 第3条:用私有构造器或者枚举类型强化Singleton属性 ...

添仔哥哥
2017/08/26
39
0
第8条:覆盖equals时请遵守通用约定

1、equals方法 1.1、简介 equals()方法,定义在Object类中,源码如下:   也就是说,在Object类中,比较的是两个对象的引用是否相同。   当我们创建一个新的类而没有覆盖equals方法时,调...

添仔哥哥
2017/08/20
27
0
Java问答:终极父类(2)—下篇

哈希码 问: hashCode()方法是用来做什么的? 答: hashCode()方法返回给调用者此对象的哈希码(其值由一个hash函数计算得来)。这个方法通常用在基于hash的集合类中,像java.util.HashMap,j...

LCZ777
2014/05/22
27
0

没有更多内容

加载失败,请刷新页面

加载更多

PhotoShop 色调:理解直方图/RGB通道信息

一、直方图:图表的形式,展示图像像素分布的情况 1.平均值:表示平均亮度 2.标准偏差值:表示亮度值范围内的中间值 3.像素: 表示用于计算直方图的像素总数 4.色阶:显示指针下面的区域亮度...

东方墨天
21分钟前
5
0
wildfly(JBoss AS)应用服务器快速入门

什么是wildfly JBoss AS 从8版本起名为wildfly。Wildfly是一个开源的基于JavaEE的轻量级应用服务器。可以在任何商业应用中免费使用。 WildFly是一个灵活的、轻量的、强大管理能力的应用程序服...

程序新视界
46分钟前
4
0
Java集合类常见面试知识点总结

Java集合类学习总结 这篇总结是基于之前博客内容的一个整理和回顾。 这里先简单地总结一下,更多详细内容请参考我的专栏:深入浅出Java核心技术 https://blog.csdn.net/column/details/21930...

Java技术江湖
49分钟前
6
0
怎么用for循环打出爱心

先上效果图: 这是用*组成的爱心,下面讲讲思路: 首先这个图形可以拆分成三部分:第一部分是上面三行的两个梯形,第二部分是中间三行的长方形,第三部分是最下面的倒三角形。 其实图形拆分好...

INEVITABLE
55分钟前
4
0
用HttpUrlConnection伪造成HttpClient

https://www.jianshu.com/p/27ad06cc39d2

shzwork
今天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部