今天华清Java学院小编要为大家分享的,是Java对象的hashCode方法的相关知识,希望对大家有所帮助。
hashCode方法的概念
Object类中有一个方法: public native int hashCode(); Java中的hashCode方法就是根据一定的规则将与对象相关的信息(比如对象的存储地址,对象的字段等)映射成一个数值,这个数值称作为散列值。
hashCode方法的作用
用于查找的快捷性。如HashMap,hashCode值用于散列来确定对象hash到哪个slot
减少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方法。
如何重写hashCode方法
不要把所有对象的hashCode都返回相同的值。比如a1和a3这两个根本不同的对象,就没有必要去比较equals,增加无谓的计算量。而且造成哈希表退化成了链表,即严重冲突。
【原则】按照equals()中比较两个对象是否一致的条件用到的属性来重写hashCode()。
{1}. 常用的办法就是利用涉及到的的属性进行线性组合。 {2}. 线性组合过程中涉及到的组合系数自定义即可。 注意,拼接之后的数值不能超过整形的表达范围。 {3}. 公式:属性1的int形式+ C1属性2的int形式+ C2属性3的int形式+……
【技巧】当属性是引用类型的时候,如果已经重写过hashCode(),那么这个引用属性的int形式就是直接调用属性已有的hashCode值。 典型的就是这个属性是字符串类型的,String类型已经重写了hashCode()方法,所以直接拿来使用即可。
热点新闻