深入理解Java-HashMap

2018-12-26  本文已影响0人  一个傻乎乎的少年

[小明的个人博客](https://www.xiaomingblog.cn)

PS:这里是以jdk8作为参考源码

1 : 认识这几个变量的作用

1

2:HashMap的4个构造函数

2

可以看出,在构造函数里面只设置了初始容量(initialCapacity)和负载因子(loadFactor)的值,并没有真正初始化HashMap,构造函数就到这儿了,下面开始看put函数

3:put函数

4 5

首次put数据时,会进行扩容,实际上就是初始化HashMap。为什么HashMap容量始终需要为2的幂次方,实际上是为了计算出的index不会出现过多的空缺,让其在每个bit位上都能存放数据。在java8里面引入了红黑树的数据结构来进行数据存储,目的是为了加速查询和删除节点元素,不理解的同学可以去看下红黑树的基本概念即可

4:HashMap结构图

lb

HashMap由数组+链表组成的,数组是HashMap的主体,链表则是主要为了解决哈希冲突而存在的,如果定位到的数组位置不含链表(当前entry的next指向null),那么对于查找,添加等操作很快,仅需一次寻址即可;如果定位到的数组包含链表,对于添加操作,其时间复杂度为O(n),首先遍历链表,存在即覆盖,否则新增;对于查找操作来讲,仍需遍历链表,然后通过key对象的equals方法逐一比对查找。所以,性能考虑,HashMap中的链表出现越少,性能才会越好。  引用 <https://www.cnblogs.com/chengxiao/p/6059914.html#t2>资料

5:get函数

get

get函数实现比较简单,计算key的hash值,然后通过hash计算Index索引获取数组内元素,首先判断第一个Node的Key是否和查询的Key值一样,是则返回,不是则进行当前节点下的链表遍历

总结:从HashMap的结构图可以得知,如果Hash函数没有设计的好从而导致很多hash碰撞的话,会导致链表层次加深,这样会在操作上影响性能。负载因子的作用就是控制临界值,可以根据自己公司的实际业务进行调整,如果存储数据增长量比较小,用默认0.75即可,如果存储数据增长很快,将负载因子调小即可,但是这样会导致频繁扩容从而影响性能。

[小明的个人博客](https://www.xiaomingblog.cn)

上一篇下一篇

猜你喜欢

热点阅读