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

主要用过 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

最新回复(0)
/jishuE_2BFOoNhIzbOVS9oJdkMljWb75LP3rV4eoDWNIlsgSMo_3D4858187
8 简首页