Java学习(二):HashMap

  1. hashmap的底层实现
    jdk7:数组、链表;
    哈希算法(幂等的):哈希冲突–>链表
    jdk8级以上:数组、链表、红黑树
    增加红黑树是为了解决链表过长查询效率过低的问题(阈值8)
    红黑树特点:左中右,小中大(保持这个结构特点则插入比较慢)

  2. 数组:一段连续的存储单元
    特点:查询o(1),查询插入o(n)(查快增删慢也是ArrayList的特点,arrayList是基于动态数组的数据结构)
    下标(索引);新增删除节点处后面所有下标依次变更
    链表:不连续,无序
    特点:查询o(n),查询插入o(1)(LinkedList)

  3. 哈希算法(散列):把任意长度值(key)通过散列算法变换成固定长度的key(地址)通过这个地址访问的数据结构。
    哈希冲突问题
    ascii码值相加在取模算出哈希表下标
    在这里插入图片描述
    4.hashmap存储
    key、value、hash(哈希code用于equals方法)、next

put(key,value):当通过转化得出的存储位置相同时(即哈希冲突),当前的位置存放新元素,新元素的next指向原来存储的元素

get(key,value):当查询某个元素,先根据下标到对应存储位置,判断当前是否为空,不为空比较key和hash,不相等则查看当前元素是否有next,再次比较
5.hashMap并发下导致cpu100%问题
并发情况下扩容导致元素指向移位(原因一)
jdk8已解决这个问题,将头插法改为尾插法
链表的头插法与尾插法详解
两个线程同时向hashMap增加数据,需要进行扩容,thread1此时存储为A–>B,在扩容同时thread2拿到执行权限,并进行扩容,因为头插法导致此时为B–>A,2执行完毕将空间让出给1,1拿到的存储为A–>B(线程创建的副本),当前为B–>A,则导致AB元素互为指向,则导致死循环,即CPU100%
HashMap底层实现原理详解

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值