用过哪些 Map 类,都有什么区别,HashMap 时线程安全的吗,并发下使 用的 Map 是什么,他们的内部原理分别是什么,比如存储方法,hashcode, 扩容,默认容量等。

本文探讨了HashMap的非线程安全特性,并介绍了在并发环境下使用ConcurrentHashMap的原因。HashMap基于数组+链表+红黑树的数据结构实现,初始容量为16,负载因子为0.75。当元素数量超过阈值时,HashMap会进行扩容,容量翻倍。Hash算法包括获取key的hashCode、高位运算和取模运算。HashMap选择合数作为桶数,以优化取模和扩容操作,减少冲突。
摘要由CSDN通过智能技术生成

主要用过 HashMap,HashMap 不是线程安全的,并发下使用的 Map 是 ConcurrentHashMap,HashMap 是数组+链表+红黑树(JDK1.8 增加了红黑树 部分)实现的。

HashMap 中 Node[] table 的默认长度 length 是 16,所能容纳的最大容量数据 的 Node(键值对)个数为 threshold=length*Loadfactor。也就是说,在数组 定义好长度之后,负载因子越大,所能容纳的键值对个数越多。

结合负载因子的定义公式可知,threshold 就是在此 Load factor 和 length(数组 长度)对应下允许的最大元素数目,超过这个数目就重新 resize(扩容),扩容后 的 HashMap 容量是之前容量的两倍。默认的负载因子 0.75 是对空间和时间效 率的一个平衡选择。

Hash 算法本质上就是三步:取 key 的 hashCode 值,高位运算,取模运算。

注意,一般 hashtable 桶数都会选择素数,因为素数因子最少,能减少冲突。 但是,hashmap 却采用非常规方法,没有选用素数,而是选用合数,主要是为 了在取模和扩容时做优化,同时为了减少冲突,HashMap 定位哈希桶索引位置 时,也加入了高位参与运算的过程

推荐文章:https://zhuanlan.zhihu.com/p/21673805

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Java天下第1

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值