Java对象的hashCode方法理解

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

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

转载于:https://my.oschina.net/hebaodan/blog/907011

你可能感兴趣的:(Java对象的hashCode方法理解)