前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >HashMap 长度及死循环问题

HashMap 长度及死循环问题

作者头像
happyJared
发布2019-06-16 13:07:20
1K0
发布2019-06-16 13:07:20
举报
文章被收录于专栏:happyJaredhappyJared
HashMap 的长度为什么是2的幂次方

为了能让 HashMap 存取高效,尽量较少碰撞,也就是要尽量把数据分配均匀。 Hash 值的范围为 -2147483648 到 2147483647,前后加起来大概是40亿的映射空间,只要哈希函数映射得比较均匀松散,一般情况是很难出现碰撞的。但问题是,一个40亿长度的数组,内存是放不下的,所以这个散列值是不能直接拿来用的。用之前,还要先做对数组长度的取模运算,得到的余数,才是用来要存放的位置(也就是对应的数组下标)。这个数组下标的计算方法是 (n - 1) & hash。(n代表数组长度)。这也就解释了 HashMap 的长度为什么是2的幂次方。

这个算法应该如何设计?

首先,我们可能会想到采用%取余的操作来实现。但是,取余(%)操作中,如果除数是2的幂次,则等价于与其除数减一的与(&)操作(hash%length == hash&(length-1),前提是 length 是2的 n 次方;), 而且采用二进制位操作 &,相对于%能够提高运算效率,这同样解释了 HashMap 的长度为什么是2的幂次方。

HashMap 多线程操作导致死循环问题

主要原因是由于多并发情况下, rehash 操作可能会造成元素间形成一个循环链表。不过,JDK1.8 后问题已经解决,但还是不建议在多线程下使用 HashMap,因为还是会存在其他问题,比如:数据丢失。并发环境下,强烈推荐使用 ConcurrentHashMap 。

参考阅读:JAVA HASHMAP的死循环

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019.06.16 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • HashMap 的长度为什么是2的幂次方
  • HashMap 多线程操作导致死循环问题
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档