hashmap hash冲突怎么解决_四、JDK1.7中HashMap哈希冲突解决方案-阿里面试经

导读

前面文章一、深入理解-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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值