HashCode

一、HashCode本质

hashCode()方法和equals()方法都是Object类中的方法,不过hashCode()方法是一个native方法,它的返回值默认与System.identityHashCode(object)一致。这个值是对象头的一部分二进制位组成的数字,这个数字具有一定的标识对象的意义所在,但绝不等价于地址。

hashCode并不是唯一的,取决于实现它的算法。

hashMap的hashCode方法对Object的hashCode值进行了优化,使之更加的散列到不同的桶,因为只有每个桶的分布比较均匀的时候,查询效率才更快,如果都堆到一个桶的话,效率就和list没有区别了。

二、作用

从Object角度看,JVM每new一个Object,它都会将这个Object丢到一个Hash表中去,这样的话,下次做Object的比较或者取这个对象的时候(读取过程),它会根据对象的HashCode再从Hash表中取这个对象。这样做的目的是提高取对象的效率。若HashCode相同再去调用equal。

总而言之,hashCode的作用是提高我们的存取效率,我们可以自定义实现hashCode,像HashMap那样。

三、解决Hash冲突的方法

1、链表法

参考HashMap

2、开放寻址法

(1)、线性探测

(2)、二次探测

(3)、双重哈希

3、建域法

把冲突的关键字存储在溢出表中,在查找时,对给定值通过散列函数计算出散列地址后,先与基本表的相应位置进行对比,如果相等,则查找成功,如果不相等,则到溢出表去进行顺序查找。

如果对于基本表而言,有冲突的数据很少的情况下,公共溢出区的结构对查找性能来说还是非常高的。

类似文章

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注