java面试系列(2) ——HashMap的put方法

说一下HashMap的put方法的大体流程:

1.根据key通过哈希扰动和路由算法得出数组的下标

2.如果下标对应数组的桶位元素为空,则将key和value封装为Entry对象(JDK 1.7是Entry对象,JDK 1.8是Node对象)并放入对应的桶位

3.如果下标对应数组种的桶位不为空,则分情况讨论:

如果是JDK 1.7,则在添加之前判断是否需要进行扩容,如果不需要则将数据封装成Entry对象,然后使用头插法添加到当前的链表中

如果是JDK 1.8 ,则会判断当前桶位上Node的类型,是红黑树、普通Node还是链表

  • 如果是红黑树,就将key、value封装成红黑树结点并添加到红黑树中,这个过程会判断红黑树中是否存在当前key,若存在则替换value值,否则添加
  • 如果该桶位是链表,则将key、value封装为Node结点,并遍历链表是否有相同的key,若有则替换value值,否则使用尾插法插入末尾。此过程结束后判断链表结点数是否超过8,超过则树化为红黑树
  • 当数据成功添加后,再进一步判断是否需要扩容,之后put方法结束

以上是关于put的大体流程,当然HashMap的put方法中还有很多细节的东西,可以查看我的另一篇博客:JDK 1.8 HashMap源码分析

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值