美文网首页
HashMap的实现原理

HashMap的实现原理

作者: 第一号伤心人 | 来源:发表于2018-03-11 10:50 被阅读11次

        Hashmap继承于AbstractMap,实现了Map、Cloneable、java.io.Serializable接口。它的key、value都可以为null,映射不是有序的。 Hashmap不是同步的,如果想要线程安全的HashMap,可以通过Collections类的静态方法synchronizedMap获得线程安全的HashMap。

        HashMap中有两个重要的参数:初识容量、加载因子。

        容量:哈希表中bucket数量,初识容量是哈希表在创建时的容量

        加载因子:是哈希表在容量自动增加前可达到多满的一种尺度。当哈希表中的条目数量超出了加载因子与当前容量的乘积时,就要对该哈希表进行rehash操作(重建内部结构,bucket*2)。加载因子大,填满的元素就越多,空间利用率高,冲突的机会加大;否则相反。

        下面基于JDK1.8 分析其源码

内部存储:HashMap的内部存储是一个数组(bucket),数组的元素Node实现了是Map.Entry接口(hash, key, value, next),next非空时指向定位相同的另一个Entry。

容量(capacity)和负载因子(loadFactor)

        capacity就是bucket的大小,loadFactor就是bucket填满程度的最大比例。当bucket中的entries的数目(而不是已占用的位置数)大于capacity*loadFactor时就需要扩容,调整bucket的大小为当前的2倍。同时,初始化容量的大小也是2的次幂(大于等于设定容量的最小次幂),则bucket的大小在扩容前后都将是2的次幂(非常重要,resize时能带来极大便利)。

        默认的capacity为16,loadFactor为0.75,但如果需要优化的话,要考量具体的使用场景。如果对迭代性能要求高,不要把capacity设置过大,也不要把loadFactor设置过小,否则会导致bucket中的空位置过多,浪费性能。如果对随机访问的性能要求很高的话,不要把loadFactor设置的过大,否则会导致访问时频繁碰撞,时间复杂度向O(n)退化。如果数据增长很快的话,或数据规模可预知,可以在创建HashMap时主动设置capacity。

相关文章

网友评论

      本文标题:HashMap的实现原理

      本文链接:https://www.haomeiwen.com/subject/fygpfftx.html