HashMap工作原理

HashMap是一个key-value键值对的数据结构,它是由数组+链表+红黑树的形式实现的。(默认长度是16,只能有一个key为null,可以有多个value为null。数组是一个个Node[]数组,我们叫它hash桶数组。它上面存放的是key-value键值对的节点,Hashmap是用hash表来存储的。)在hashmap里为了解决hash冲突,采用链地址法。简单来说就是数组加链表的形式来解决,当数据被hash后,得到数组下标,把数据放在对应下标的链表中。

(在解决hash冲突的时候,采用的是链地址法,put的过程是首先判断table[i]位置,是否为空,为空,直接插入,不为空判断和当前值是否相等,相等就覆盖,如果不相等的话,判断是否是红黑树节点,如果不是,就从table[i]位置开始遍历链表,相等覆盖,不相等插入。

HashMap的方法实现:put方法
put方法的第一步,就是要计算出要put元素在hash桶数组中的索引位置,得到索引位置需要三步:取put元素key的hashcode值,高位运算,取模运算,(高位运算就是用第一步得到的值h,用h的高16位和低16位进行异或操作,第三步为了使hash桶数组元素分布更均匀,采用取模运算,取模运算就是用第二步得到的值和hash桶数组长度-1的值取与。这样得到的结果和传统取模运算结果一致,而且效率比取模运算高)

先判断hashmap是否为空,为空的话扩容,不为空计算出key的hash值i,然后看table[i]是否为空,为空就直接插入,不为空判断当前位置的key和table[i]是否相同,相同就覆盖,不相同就查看table[i]是否是红黑树节点,是的话就用红黑树直接插入键值对,不是的话从table[i]开始遍历链表插入,相等覆盖,不相等插入。
get方法就是计算出要获取元素的hash值,去对应位置取即可。

扩容机制:hashmap的扩容中主要进行两部,第一步把数组长度变为原来的两倍,第二部把旧数组的元素重新计算hash插入到新数组中,在jdk1.8时,不用重新计算hash,只用看看原来的hash值新增的一位是零还是1,如果是1这个元素在新数组中的位置,是原数组的位置加原数组长度,如果是零就插入到原数组中。扩容过程第二部一个非常重要的方法是transfer方法,采用头插法,把旧数组的元素插入到新数组中。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值