读HashMap 源码(jdk11)的见解

如果想系统详细的了解HashMap请移步各大佬博客。这篇文章只是个人的一些见解。

  1. 数组+链表 或 数组+红黑树。这种说法感觉有迷惑性。

    之前看博客都说 HashMap 的存储是数组+链表(jdk6), 或者数组+链表 和 数组+红黑树 共存(jdk8)(我电脑上没有jdk7所以没有验证jdk7是怎样存储的)。

    我认为描述成 链表类型的数组 或者 红黑树类型的数组是不是更好理解

下面是hashMap的put方法的一部分

 

 

 可以看到新增的数据是以Node类型的对象添加到数组里的。  看一个Node的定义

单链表的数据结构。 jdk6,直接存储的是Entry这个类。后来应该是增加了TreeNode,就把Entry定义成了一个接口。

 

  2. 不是用key的hash值直接去寻址的

 

是用的数组长度-1(n-1) 和 key的hash值(hash)做 & (与)运算的结构寻址的。 下面是我向hashMap中插入一条数据时(插入之前hashMap是空)debug的信息

 

可以看到 hash=55608   i=(n-1)&hash  值 是8。如果直接用key的hash去寻值。这个数组得有多大。

转载于:https://www.cnblogs.com/zsukai/p/10135548.html

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值