JDK_1.8中对hash算法和寻址算法是如何优化的?

首先咱们先来了解一下如何使用key值的hashCode去寻址:

获取key值的hashCode
利用hashCode%数组长度得到index下标
这就是一个寻址的过程,但是取模是一个非常消耗性能的操作,并且如果张三和李四取模后得到下标标一致就会出现hash冲突,解决hash冲突又是是一个耗时的操作,所以JDK做了以下几个步骤来优化;

static final int hash(Object key) {
        int h;
        return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);
    }

这段代码是HashMap中在获取hashCode之后进行优化的方法,int是4个字节也就是32位,代码中看到key值的hashCode赋值给h,然后将h和h右移16位的结果进行了异或运算,什么意思呢,假设h原先的值为1111 1111 1111 1111 1011 1011 1111 0011(这是二进制的值,不懂的好好复习一下数据结构),右移16位之后呢得到了0000 0000 0000 0000 1111 1111 1111 1111,然后将两者进行亦或运算得到了1111 1111 1111 1111 0100 0100 0000 1100,这个得到的二进制结果他的第16位是不是同时包含了原先key值的hashCode的高16位和低16位的特征,先记住这一点为什么要这么做;

接下来我们说取模是一个非常耗时的操作,所以JDK选择了另外一种方式,也就是将异或得到的hashCode和数组长度进行&的操作,经过前人的努力,得到了一个公式,hashCode&(array.length-1)=hashCode%数组长度(这里有一个要求就是数组长度得是2的n次方),一般来说数组的长度初始是16,所以array.length-1也就是0000 0000 0000 0000 0000 0000 0000 1111(后称A),拿A和未经过处理的h去进行&运算是不是高16位根本都没有参与,因为A的高16位全部是0,&运算是其中一方为0结果就是0,所以如果只有h的低16位参与了运算是不是就加大了A&h结果相同的概率,所以JDK要将h右移16位在进行亦或运算,把高16位的特征也加入到低16位中去,这样A&h的结果相同的概率就小了,也就会减少处理hash冲突所带来的性能损耗;

JDK8引入了一种新的哈希算法,即HashMap中的哈希算法。这个算法是根据键对象的hashCode值进行计算的。在寻址算法中,使用了与运算来计算数组下标,即`(n - 1) & hash`,其中n是数组的长度,hash是键对象的hashCode值。这种算法相比直接使用hashCode的寻址算法,可以更好地保持哈希值的均匀分布,减少冲突的可能性,提高查询的效率。 在JDK8中,为了进一步提高哈希算法的性能,在计算哈希值时进行了一些优化。具体而言,通过使用位运算异或操作对hashCode值进行了处理,使得哈希值更加分散,降低了碰撞的可能性。 通过这种方式,JDK8以后的哈希算法HashMap等数据结构中表现出更好的性能更低的冲突率。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [JDK8中对hash算法寻址算法优化](https://blog.csdn.net/weixin_43093006/article/details/111243211)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *3* [jdk-8u241-linux-i586.tar.gz.7z](https://download.csdn.net/download/qq_21516633/12377273)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值