当前位置:首页 > java基础 > 正文内容

java中HashMap的-Djdk.map.althashing.threshold

淙嶙7年前 (2018-07-19)java基础732

1、参数jdk.map.althashing.threshold

使用方式:-Djdk.map.althashing.threshold=5

2、作用

当hash key 是String的时候,同时hash code 算法薄弱的情况,可以降低hash值的碰撞

代码中英文描述

3、如何做到?

首先,我们都知道hashMap会根据key生成一个hash值,看代码如何生成一个key的hash值

a、如果是String的话,就直接使用stringHash32生成hash值

b、直接调用Obejct的hashCode()方法,同时要和hashSeed 这个值进行异或操作

可以看出生成的hash值和hashSeed 这个值有着紧密的关系,但是这个值默认是0。也就是说不管HashMap存多少数据,hashSeed 都是不会变的,可以看出随着hashMap 的容量增大,hash碰撞的概率增大的可能性也就增大。如果hash值,碰撞很高的话,那么hashMap逐渐演化成链表,性能就急剧下降。

4、如何防止hashMap演化成链表?

从代码看出jdk.map.althashing.threshold这个变量设置的值最终会存放在静态常量ALTERNATIVE_HASHING_THRESHOLD

当hashMap扩大容量时,都是调用该方法。从代码可以看出,当数组容量超过,我们设定的值ALTERNATIVE_HASHING_THRESHOLD且是vm booted,同时 hashSeed==0的时候,hashSeed的值就是用随机量,而不是固定的等于0。这样就能降低碰撞,就能降低演化成链表概率。

代码具体过程:

5、使用场景

很少场景会用的这个值,根据我自己测试的情况,默认配置情况就碰撞率相对来说已经可以接受了,分享这个主要是看看代码是怎么实现而已。

具体的测试类地址:https://github.com/tingliu9/basic-test/blob/master/src/test/java/com/github/tingliu/basic/test/Map2Test.java

6、总结

-Djdk.map.althashing.threshold=-1:表示不做优化(不配置这个值作用一样)

-Djdk.map.althashing.threshold

-Djdk.map.althashing.threshold=1:表示总是启用随机HashSeed

-Djdk.map.althashing.threshold>=0:便是hashMap内部的数组长度超过该值了就使用随机HashSeed,降低碰撞

jdk版本:jdk7_75

原文:https://my.oschina.net/huangy/blog/1619144

相关文章

JVM总结

JVM总结

花费了一周时间对深入理解Java虚拟机做了个回顾,对原来的知识做了个补充,直到慢慢的阅读中,才发现有好多东西已经忘了。把所阅读的通过一个思维导图做个了简单的总结,时间仓促,还有不全。待十一节后继续补充...

集合各实现类的底层实现原理(转)

集合各实现类的底层实现原理(转)

ArrayList实现原理要点概括 ArrayList是List接口的可变数组非同步实现,并允许包括null在内的所有元素。 底层使用数组实现 该集合是可变长度数组,数组扩容时,会将老数组中的元素重...

JAVA中SPI机制

JAVA中SPI机制

SPI是什么SPI全称Service Provider Interface,是Java提供的一套用来被第三方实现或者扩展的API,它可以用来启用框架和替换组件。 整体机制图如下: 调用方->标准...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。