导读
前面文章一、深入理解-Java集合初篇 中我们对Java的集合体系进行一个简单的分析介绍,上两篇文章二、Jdk1.7和1.8中HashMap数据结构及源码分析 、二、JDK1.7和1.8HashMap数据结构及源码分析-续 中我们分别对JDK1.7和JDK1.8中HashMap的数据结构、主要声明变量、构造函数、HashMap的put操作方法做了深入的讲解和源码分析。三、深入理解Java中的HashMap「网易面试快答」 文章中主要针对面试中常见的文件进行简单解答。
本篇文章我们将要对JDK1.7中HashMap的哈希冲突及减少哈希冲突的解决方案做详细的介绍,并通过源码加深大家的理解。
如果大家在面试中针对Java集合或者Java中的HashMap大家还有什么疑问或者其他问题,可以评论区告诉我。
简单介绍
JDK1.7---》哈希表,链表
JDK1.8---》哈希表,链表,红黑树--- JDK1.8之后,当链表长度超过8使用红黑树。
非线程安全
0.75的负载因子,扩容必须为原来的两倍。
默认大小为16,传入的初始大小必须为2的幂次方的值,如果不为也会变为2的幂次方的值。
根据HashCode存储数据。
JDK1.7的哈希冲突解决方案
1.配置threshold:jdk.map.althashing.threshold(阀值-门槛)
配置改变hash冲突的门槛
源码:
/** * The default threshold of map capacity above which alternative hashing is * used for String keys. Alternative hashing reduces the incidence of * collisions due to weak hash code calculation for String keys. *
-Djdk.map.althashing.threshold = -1: 表示不做优化(不配置这个值作用一样)
-Djdk.map.althashing.threshold < 0: 报错
-Djdk.map.althashing.threshold = 1: 表示总是启用随机HashSeed
-Djdk.map.althashing.threshold >= 0 : 表示hashMap内部的数组长度超过该值了就使用随机HashSeed,降低碰撞
如果 配置该值为-1,表示不做hash冲突的优化;
如果 配置该值小于0,则报错;
如果 配置该值为1 则表示总是使用一个随机值(哈希因子hashseed)对hash冲突.
如果 配置该值大于等于0 表示当HashMap中数组长度超过该值的时候就使用随机值(哈希因子hashseed)来降低哈希冲突的可能性。
2使用一个私有的静态内部类Holder加载虚拟机引导之后才被初始化的值。
使用私有的静态内部类Holder加载上一步配置的Jdk.map.althashing.threshold。
源码:
/** * The default threshold of map c