hashmap1.7和1.8的区别

HashMap1.7的底层结构是Entry数组+链表,而1.8引入了红黑树,结构变为Node数组+链表+红黑树。1.7在扩容时会颠倒链表顺序并重新计算所有元素位置,而1.8在元素插入后检查是否需要扩容,保持链表顺序。1.8当链表长度达到8时转为红黑树,元素总数达64时也会转换。此外,1.7和1.8的初始化容量处理方式也有所不同。

底层结构:

        hashmap1.7底层结构是entry数组+链表,

        hashmap1.8底层结构是node数组+链表+红黑树

扩容策略:7上8下(7前8后)

        1.8会保持原链表的顺序并且在元素插入后检测是否需要扩容,扩容后,不会把所有元素重新计算一遍位置;

        1.7会颠倒链表的顺序并且在元素插入前检测是否需要扩容,扩容后,把所有元素重新计算一遍位置,为了降低hash冲突;

Hashmap中文名哈希映射,是基于哈希表的 Map 接口的实现,HashMap是一个用于存储Key-Value键值对的集合。

相同key,新值会在数组的位置把旧value值覆盖掉,并返回旧的value值,如果是不同key,但是key计算出来的hash一样,则会在数组中,按照7上8下生成链表;

1.8什么时候转红黑树,什么时候退化成链表

红黑树的出现时机(链表树化):1. 链表的长度达到8; 2. 元素的总数量达到64。

底层数组类型:

        1.7数组类型:entry数组

        1.8数组类型:node数组

1.7:

hashMap线程不安全?hashMap在多线程的环境下,会出现什么问题?

1.会出现丢值 2.会出现环链

总结:

1:hashMap底层结构是Entry数组+单项链表

2:初始容量是0

3:第一次执行put 方法会初始容量

4:key 可以为null 并且会储存在下标为0的位置

5:hashMap为什么无序,因为它的位置是通过hash值和数组长度计算出来的

6:为什么不能重复,重复的元素,会进行values的覆盖

7:头插法:新节点会变成老节点的头节点

8:扩容机制?扩容时机?同时满足储存个数大于加载因子以及数组当前索引不为空才会扩容,扩容为原来的两倍,并重新计算阈值

9:扩容大小:是原来的两倍

10:扩容后,把所有元素重新计算一遍位置,为了降低hash冲突

11:为什么需要加载因子?

为了减少hash冲突的次数(哈希冲突就是将要存入的位置已经有值),就是减少链表的出现

12:为什么初始容量是16,这里就不是眼缘了,因为2的幂次方进行位运算速度是最快的

1.8:

Java1.8  无参构造没有初始容量大小,只有在put时初始容量newCap=16

HashMap hashMap=new HashMap(8);也是在put时容量newCap=8

HashMap hashMap=new HashMap(3);不是说容量为3,而是4,大于等于最小的2的n次方

HashMap hashMap=new HashMap(3);put第4个数据时,不会报错,他会自动扩容的,是在容量*0.75即就是4*0.75=3,put第三次完成之后开始扩容(1.8扩容时会保持原链表的顺序并且在元素插入后检测是否需要扩容),新容量=旧容量*2,即就是4*2=8

参考:

【老生常谈系列】hashMap 1.7 和1.8的区别_EmineWang的博客-CSDN博客_hashmap1.7和1.8的区别

JDK1.8中的HashMap扩容原理_野狼飞飞的博客-CSDN博客_hashmap1.8扩容

HashMap1.7和1.8实现原理和区别_EmineWang的博客-CSDN博客_hashmap底层实现原理1.7和1.8

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Stone.小小的太阳

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值