深入理解Java-HashMap

[小明的个人博客](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)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 前言 这次我和大家一起学习HashMap,HashMap我们在工作中经常会使用,而且面试中也很频繁会问到,因为它里...
    liangzzz阅读 12,416评论 7 102
  • 摘要 HashMap是Java程序员使用频率最高的用于映射(键值对)处理的数据类型。随着JDK(Java Deve...
    周二倩你一生阅读 5,025评论 0 5
  • 望夫久不至,怨作商人妇。 声歌别处寻,重金盈泪珠。 丽人香车影,更深斜云孤。 浮华称名卓,风情邂逅疏。 粉抹饰旧容...
    陽春阅读 734评论 2 2
  • 一年,曾经不知好歹的我不懂跟这些优秀的人多学习学习,拼事业,半年9千多万的业绩,先犯错误,后道歉,连续好几天每天休...
    虚空小白阅读 1,176评论 0 0
  • 就要中高考了,相信考生和家长都知道考试流程和考试规定文具,但是各位肯定没看过电脑阅卷流程啥样吧!很多同学毛躁,涂卡...
    连老师阅读 3,647评论 0 1