jdk1.8中HashMap的数据结构优化

jdk1.7及以前的实现方式

在jdk1.7及以前,是通过数组链表的数据结构来存储哈希表的。

存在的问题是,当哈希碰撞比较严重,在数组的某一些index上的链表比较长的话,会影响哈希表的查询和更新效率。

我们知道,链表是线性查找的,如果链表有n个元素,那么查询效率为O(n),当n逐渐增大时,链表的查询耗时会线性增长。

jdk1.8中的优化

为了提高查询效率,jdk1.8中使用红黑树(平衡二叉查找树)来替代链表,使得查询效率能够达到O(log2n)。(公式格式显示关系,2为底数)

由于红黑树相对链表会复杂一些,因此在具体的实现时,只有当某一个index上的元素个数超过设定的阈值(默认是8)时才会在该index上启用红黑树结构,否则依旧使用链表。

同时,如果哈希表的数组长度小于设定的阈值时(默认是64),也不会启用红黑树,而是做一次resize操作,期望通过增大数组长度来减缓因哈希碰撞而在某一些index上元素数量过多的问题。

因此,只有当哈希表数组长度大于等于设定的阈值(默认是64),且某一个index上的元素个数超过设定的阈值(默认是8),才会在该index上使用红黑树替代链表。

转载于:https://my.oschina.net/u/241305/blog/2962153

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值