文档章节

Java对象的hashCode方法理解

hebaodan
 hebaodan
发布于 2017/05/22 23:29
字数 794
阅读 61
收藏 0

Java对象的hashCode方法理解

概念

Object类中有一个方法: public native int hashCode(); Java中的hashCode方法就是根据一定的规则将与对象相关的信息(比如对象的存储地址,对象的字段等)映射成一个数值,这个数值称作为散列值。

作用

  1. 用于查找的快捷性。如HashMap,hashCode值用于散列来确定对象hash到哪个slot
  2. 减少equals方法的调用次数,从而提高程序效率。如在集合中两个对象相等判断时,先比较hashCode方法的值,相等再调用equals方法,所以在对象不相等时直接hashCode不等判断结束,减少equals方法的调用。当然也存在对象不相等但hashCide值相等的情况,如: "wzd".hashCode()=="x[d".hashCode()

hashCode约定

  • 在程序执行期间,只要equals方法的比较操作用到的信息没有被修改,那么对这同一个对象调用多次,hashCode方法必须始终如一地返回同一个整数。
  • 如果两个对象根据equals方法比较是相等的,那么调用两个对象的hashCode方法必须返回相同的整数结果。
  • 如果两个对象根据equals方法比较是不等的,则hashCode方法不一定要返回不同的整数。但是,为不相等的对象生成不同hashCode可以提高hash的性能,减少冲突。

###问题 既然对象信息不变,hashCode也不变,那每次调用hashCode方法是重新计算吗?如String.hashCode()?

hashCode存储

如果hashCode值不变,那JVM就可以缓存其值不必要重新计算,HotSpot虚拟机的对象头就存储了对象的哈希码(HashCode)。

equals方法与hashCode方法

大家都知道,在重写equals方法的同时,必须重写hashCode方法。为什么这么说呢? 看完上部分想必知道一二,详细的举例可以看这里:http://www.importnew.com/18851.html

如何重写hashCode方法

  1. 不要把所有对象的hashCode都返回相同的值。比如a1和a3这两个根本不同的对象,就没有必要去比较equals,增加无谓的计算量。而且造成哈希表退化成了链表,即严重冲突。
  2. 【原则】按照equals()中比较两个对象是否一致的条件用到的属性来重写hashCode()。

{1}. 常用的办法就是利用涉及到的的属性进行线性组合。 {2}. 线性组合过程中涉及到的组合系数自定义即可。 注意,拼接之后的数值不能超过整形的表达范围。 {3}. 公式:属性1的int形式+ C1属性2的int形式+ C2属性3的int形式+……

【技巧】当属性是引用类型的时候,如果已经重写过hashCode(),那么这个引用属性的int形式就是直接调用属性已有的hashCode值。 最典型的就是这个属性是字符串类型的,String类型已经重写了hashCode()方法,所以直接拿来使用即可。

参考

http://blog.sina.com.cn/s/blog_700aa8830101jtlf.html http://blog.csdn.net/neosmith/article/details/17068365

© 著作权归作者所有

hebaodan
粉丝 9
博文 25
码字总数 30036
作品 0
朝阳
程序员
私信 提问
用来理解 Java 编程语言的 8 个图表

很多时候,一张图比你说 1000 个字能更有效的说清楚一个问题。我们列举了 8 个关于 Java 语言的图表,或许可以让你对 Java 有着更深入的认识。 1. 字符串不变性(String Immutability) 下面的...

oschina
2013/09/23
7.8K
29
图说 Java:理解 Java 机制最受欢迎的 8 幅图

世间总是一图胜过千万言,下面的8幅图来自于 Program Creek 的 Java教程 ,目前这是该网站最受欢迎的文章. 希望本文能帮你回顾你已经知道的那些知识。如果图片讲解的不够清晰,你可能需要阅读详...

大数据之路
2013/10/30
0
3
Java 基础:hashCode方法

Writer:BYSocket(泥沙砖瓦浆木匠) 微博:BYSocket 豆瓣:BYSocket 一、前言 泥瓦匠最近被项目搞的天昏地暗。发现有些要给自己一些目标,关于技术的目标: 专注很重要。专注Java 基础 + H5...

泥沙砖瓦浆木匠
2015/04/27
0
4
理解 equals(),hashcode()和 ==

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

Bour
2018/08/04
0
0
Java编程中那些再熟悉不过的知识点(持续更新)

本文来自于我的慕课网手记:Java编程中那些再熟悉不过的知识点,转载请保留链接 ;) 1. 面向对象和面向过程的区别 2. Java 语言有哪些特点 3. 关于 JVM JDK 和 JRE 最详细通俗的解答 4. Oracl...

小码哥的freestyle
04/11
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Spark Streaming的优化之路——从Receiver到Direct模式

          作者:个推数据研发工程师 学长 1 业务背景 随着大数据的快速发展,业务场景越来越复杂,离线式的批处理框架MapReduce已经不能满足业务,大量的场景需要实时的数据处理结果来...

个推
49分钟前
2
0
壮丽70年·奋斗新时代|蒸妙集团熏蒸中会阴熏蒸的神奇好处

聚结相合之处为会。会阴居两阴间,为督、任、冲三脉的起点,三脉背出两阴之间,会聚阴部,因名会阴。会阴,经穴名。出《针灸甲乙经》。会阴别名屏翳、下极、金门。属任脉。在会阴部,男性当阴...

公益传承
57分钟前
2
0
pentaho-kettle-8.2.0.0-R源码开发环境搭建

1.从Kettle官网下载源码,本文使用的是pentaho-kettle-8.2.0.0-R 下载地址:https://codeload.github.com/pentaho/pentaho-kettle/zip/8.2.0.0-R 2.打开eclipse,选择一个新的工作空间,然后设...

gq_2010
今天
1
0
lua web快速开发指南(7) - 高效的接口调用 - httpc库

httpc库基于cf框架都内部实现的socket编写的http client库. httpc库内置SSL支持, 在不使用代理的情况下就可以请求第三方接口. httpc支持header、args、body、timeout请求设置, 完美支持各种h...

水果糖的小铺子
今天
5
0
通过四道常问面试题,带你了解什么是数据库分库分表

编者语:为了避免被误解为:「手里有把锤子,看什么都是钉子!」,说明一下不是什么业务都适合分布式数据库,更不是用了分布式数据库性能就一定能得到扩展。 其次:本文为纯干货,建议先转发...

老道士
今天
8
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部