HashMap在jdk1.7和1.8中的区别


前言

大家好, 这里是Yve菌, 今天给大家总结一下HashMap在jdk1.7和1.8的区别


HashMap在jdk1.7和1.8中的区别

1. 结构不同

首先HashMap在1.7中是以数组+链表的形式存在的, 如图所示:
hashmap结构
而HashMap在1.8中则是以数组+链表+红黑树构成的, 当一个节点的链表长度超过8并且数组长度超过64时会将链表转换为红黑树, 如图:
hashmap结构

2. 扩容条件不同

在1.7中进行初始化或内部当size超过阈值时会触发扩容, 扩容之后的数组大小为之前的两倍, 并且之前该下标的元素只会继续保存在该下标或者两倍的下标位置.

在1.8中扩容触发条件有两个

  1. 当初始化或size超过阈值时会触发扩容
  2. 一条链表上节点数量超过8时会调用treeifyBin()方法, 方法内部如果数组长度小于64则会触发resize()扩容方法在这里插入图片描述 在这里插入图片描述

3. put插入方式不同

在1.7中, hashmap调用put()方法插入时时采用的是头插法, 并且因为hashmap不是线程安全的, 所以当并发插入并触发扩容时可能会把数组内部的链表变成循环链表, 造成死循环的问题

在1.8中, hashmap的put()方法改为了尾插法插入, 因此解决了1.7中并发扩容造成的循环链表问题, 但是实际上在往红黑树内部并发插入时也有可能会造成两个父节点相互引用而导致的死循环问题

4. 扩容时间不同

在1.7中, hashmap会先检测是否需要扩容之后再往里面放数据, 而在1.8中hashmap会先把数据放进去在检测是否需要扩容

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值