java map put get_HashMap的put/get方法详解

HashMap:

HashMap的数据结构: 可以称为散列表, 结构是 :数组 + 链表[树]-> 当链表>= 7 的时候, 链表转为树

put 方法:

1、通过key 调用hashcode 得出 hash 值 ;

2、判断map是否为null 或只长度是否为0,如果为真,则 reszie() 数组 ;

3、根据hash[int]值 与 数组长度 -1 的值 进行 & 运算, 定位到 key 所在位置 进行判null

4、如果为null,则直接在此位置插入数据;

5、如果不为null,判读 key所在位置的对象的和hash 值 和要插入的hash 值 是否相等,并且判断key是否相等(== 和equals);

5-1、为真, 则直接返回新插入的对象数据;

5-2、继续判断插入的位置是否为[treeNode]树状链表,为真,则调用插入的相关方法(putTreeVal),此处数据结构个人理解为红黑树;

5-3、如果不为树状链表,则进行循环比较,从链表的头开始进行逐个比较;

5-3-1、如果链表头的 next 为null,则直接插入;此时如果链表长度大于等于7,则转为树状链表(调用 treeifyBin()方法)并调出循环;

5-3-2、如果链表中的数据对象和插入的数据对象的hash值相等,且key相等(== 和equals),则直接调出循环;

6、如果插入的对象已经存在,只有当key 对应的值为null 的时候进行赋值,并返回插入对象的value;

7、记录修改次数 ++ ;

8、判断map此时的size+1 后 是否大于阀值,大于则进行 resize() 扩容;

9、移除map 之前的数据

get 方法:

1、通过key 调用hashcode 得出 hash 值 ;

2、根据hash值与 数组长度 -1 的值 进行 & 运算, 定位到 key 所在位置

3、如果链表头的hash值和key 相等(== 和equals),则直接返回该值;

4、如果链表中有多个,则判断链表数据结构

4-1、如果为树状链表,则调用方法getTreeNode() 获取对应值并返回;

4-2、如果为 链表,则从链表头开始遍历 获取对应的值 并返回 ;

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值