HashMap全家桶

HashMap存储结构

图片来源于github上cyc大神
JDK1.7中HashMap是我们非常常用的数据结构,由数组和链表组合构成的数据结构。在JDK1.8中,由数组和链表和红黑树组合构成的数据结构。数组里面每个地方都存了Key-Value这样的实例,在Java7叫Entry在Java8中叫Node。每一个节点都会保存自身的hash、key、value、以及下个节点,我看看Node的源码。
借用敖丙大神的图

HashMap为什么线程不安全?

JDK1.7中,HashMap采用拉链法来解决Hash冲突。PS:Hash冲突的意思是当插入的<K1,V1>和<K2,V2>,K1和K2的hashcode值相同,计算出的数组下标相同,因此会发生Hash冲突。解决方式是拉链法头插法,就是将相同的<K2,V2>插入到<K1,V1>的头部,然后将链表下移,让链表的头部和数组对齐。正是因为头插法,所以才会发生造成HashMap线程不安全。
在这里插入图片描述

HashMap.put()原理

在这里插入图片描述

  1. 首先计算key和hashcode值:h = key.hashcode()
  2. 将h与自己高16位做异或运算,目的是增加了随机性,减少了碰撞冲突的可能性
    在这里插入图片描述
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值