HashMap实现原理

  1. HashMap概述

HashMap是基于哈希表的Map接口的非同步实现。此实现提供所有可选的映射操作,并允许使用null值和null键。此类不保证映射的顺序,特别是它不保证该顺序恒久不变。

  1. HashMap的数据结构

HashMap实际上是一个“链表散列”的数据结构,即数组和链表的结合体。在jdk1.8后引入了红黑树。
在这里插入图片描述

HashMap里面实现一个静态内部类Entry,其重要的属性有 key , value,
next,从属性key,value我们就能很明显的看出来Entry就是HashMap键值对实现的一个基础bean,我们上面说到HashMap的基础就是一个线性数组,这个数组就是Entry[],Map里面的内容都保存在Entry[]里面。

  1. 重要参数

loadFactor : 负载因子 默认0.75
initialCapacity : 初始化容量16,最大是(1 << 30)1073741824
table : Entry<K,V>[] table 是用来存储数据的数组
Entry<K,V> 是HashMap的一个内部类,链表结构

  1. HashMap的扩容

当hashmap中的元素越来越多的时候发生hash冲突的几率就越来越高,这时就要对其进行扩容,什么时候扩容呢?当容量达到了当前总容量乘上loadFactor的数量时就要对其扩容,在hashmap中一次是扩容两倍。

  1. 红黑树的引入

在jdk1.8中引入了红黑树,当一个索引下的链表长度达到8时,就会将这个链表转换为红黑树。这样大大提高了hashmap的性能,以及减少了hash冲突。

  1. 存元素

当我们往HashMap中put元素的时候,先根据key的hashCode重新计算hash值,根据hash值得到这个元素在数组中的位置(即下标),如果数组该位置上已经存放有其他元素了,那么就根据equels比较key是否相等,如果相等替换为新的value值。否则在这个位置上的元素将以链表的形式存放,新加入的放在链头,最先加入的放在链尾。如果数组该位置上没有元素,就直接将该元素放到此数组中的该位置上。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值