HashMap底层实现原理

HashMap中的put()和get()的实现原理:

三个方面:

添加元素

获取元素

扩容操作

这里的hash算法本质上就三步:取key的hashcode值、高位运算,取模运算;

存储结构-字段

从结构实现来讲,HashMap是数组+链表+红黑树(JDK1.8引入)实现的。
如图所示:

在这里插入图片描述
从源码可知,hashmap里面有一个非常重要的字段就是

transient Node<K,V>[] table;

即哈希桶数组,明显它是一个Node的数组。
Node是HashMap的一个内部类,实现了Map.Entry接口;本质上就是映射(键值对)上图中数组下标为1的位置上有3个Node对象,下标为6位置上的44,76等都是Node对象。
HashMap就是使用哈希表来储存的,哈希表为解决冲突可以采用开放地址法和链地址法等来解决地址冲突。HashMap采用了链地址法;
链地址法,简单来说就是数组+链表的结合。在每个数组元素上都有一个链表结构,当数据被hash后,得到数组的下标。

扩容机制

扩容(resize)就是从新机算容量,向HashMap中不停的添加元素,而HashMap对象的内部的数组无法装载更多的元素时,对象就需要扩大素组的长度,以便于能装入更多的元素。当然java里的数组时无法扩容的。方法是使用一个新的数组代替已有的容量小的数组,就像我们用一个小桶装水,如果像装更多的水,就得换大水桶。

1、map.put(k,v)实现原理
(1)首先将k,v封装到Node对象当中(节点)。
(2)然后它的底层会调用K的hashCode()方法得出hash值。
(3)通过哈希表函数/哈希算法,将hash值转换成数组的下标,下标位置上如果没有任何元素,就把Node添加到这个位置上。如果说下标对应的位置上有链表。此时,就会拿着k和链表上每个节点的k进行equal。如果所有的equals方法返回都是false,那么这个新的节点将被添加到链表的末尾。如其中有一个equals返回了true,那么这个节点的value将会被覆盖。
2、map.get(k)实现原理
(1)先调用k的hashCode()方法得出哈希值,并通过哈希算法转换成数组的下标。
(2)通过上一步哈希算法转换成数组的下标之后,在通过数组下标快速定位到某个位置上。如果这个位置上什么都没有,则返回null。如果这个位置上有单向链表,那么它就会拿着K和单向链表上的每一个节点的K进行equals,如果所有equals方法都返回false,则get方法返回null。如果其中一个节点的K和参数K进行equals返回true,那么此时该节点的value就是我们要找的value了,get方法最终返回这个要找的value。

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值