【Java】深入源码讲HashMap在JDK7与JDK8的区别

JDK7时使用的主要步骤

当我们创建HashMap实例即new一个对象时,在底层HashMap会帮我们创建一个长度为16的一维数组,类型为Entry[],名为table。为什么长度是16?因为底层容量默认就是定义为16。

当我们逐个调用put方法将key-value(Entry对象)放入底层数组时,底层的方法首先会调用key(我们所插入的key-value中的key)所在类(不一定是自定义类,String,Object等都可,提到这三个类是因为自定义类你可以选择重写hashCode,而String则已经重写了hashCode,Object作为所有类的间接父类本身具有hashCode)的hashCode()计算当前key的哈希值(如果自定义类没有重写则调用其父类的hashCode)。

这个哈希值在经过某种算法计算后,能够得到该key-value将在数组中存放的位置。如果此时该位置没有其他元素,则该key-value直接添加成功。如果该位置上已经有元素了,则会比较key和该位置上已经存在的元素的哈希值。如果key的哈希值与其他数值的哈希值都不同,则该key-value直接添加成功。如果key的哈希值与某个元素的哈希值相同,则会调用key所在类的equals方法,若equals方法返回false,则该key-value直接添加成功,否则说明key与这个元素相同,则该key对应的value去覆盖这个元素的value值

JDK8与JDK7使用的主要步骤区别:

  • 在创建HashMap实例时,jdk7是直接创建数组,而jdk8是将负载因子赋给当前实例,没有创建数组,在第一次调用put时才会创建数组。

 

  • jdk7底层数组为Entry类型,而jdk8底层数组是Node类型,

  • 虽然本质上也是Entry类型。

 

  • jdk7时底层结构为数组加链表,而jdk8时底层结构为数组加链表加红黑树。
  • jdk7用的是头插法,而jdk8及之后使用的都是尾插法,那么他们为什么要这样做呢?因为jdk7是用单链表进行的纵向延伸,当采用头插法时会容易出现逆序且环形链表死循环问题。但是在jdk8之后是因为加入了红黑树使用尾插法,能够避免出现逆序且链表死循环的问题。

JDK8什么时候使用红黑树存储数据?

当数组的某一索引位置上的元素以链表形式存在的个数>=8并且当前数组长度>64时,此时该索引位置上的所有数据将会改用红黑树存储。

源码分析


                
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值