偭试馆:说一下hashmap底层实现

简介: 偭试馆:说一下hashmap底层实现

JDK1.7中HashMap

底层结构:

JDK1.7中hashmap底层采用的是数组加链表的方式进行存储数据的,默认的初始大小为16,负载因子0.75(可能会问道为什么0.75,因为负载因子大了会造成更多的冲突,对于数据的存取并不友好,如果过小了,对空间的利用率就会偏低,所以选择的负载因子为0.75),每次扩容的时候大小为原来的两倍(为什么为2的次幂,因为求余的时候对于key求出hash值直接与长度-1相交即可,因为长度-1之后对应的二进制均为1),插入数据采用的头插法,达到阈值进行扩容。

不安全问题:

1. 造成循环链表,因为使用头插法,所以在扩容的时候出现的试多线程环境下,因为头插法在扩容的新数组上造成循环链表。

2. 值覆盖问题,因为在一个数组节点上最初没有值的时候,如果一个线程给这个几点赋值的时候时间片到了,其他线程也来给这个节点赋值,最后轮到原来的线程,也复制,就把第二个线程赋值的内容给覆盖了。

 

JDK1.8中HashMap

底层结构:

JDK1.8中hashmap底层采用的是数组加链表加红黑树的方式进行存储数据的,默认的初始大小为16,负载因子0.75(可能会问道为什么0.75,因为负载因子大了会造成更多的冲突,对于数据的存取并不友好,如果过小了,对空间的利用率就会偏低,所以选择的负载因子为0.75),每次扩容的时候大小为原来的两倍(为什么为2的次幂,因为求余的时候对于key求出hash值直接与长度-1相交即可,因为长度-1之后对应的二进制均为1),插入数据采用的尾插法,达到阈值进行扩容(扩容机制有所不同:jdk1.8的扩容不再重新计算hash而是只需要看看原来的hash值新增的那个bit是1还是0就好了,是0的话索引没变,是1的话索引变成"原索引+ oldCap")(扩容触发条件:1.节点数量达到阈值,2.当红黑树中节点大于8的时候,并且节点个数小于64.)红黑树转变:当数组中单个节点的含有元素大于8并且总结点数大于64的时候转换为红黑树,小于6的时候退换成链表。

不安全问题:

因为使用的是尾插法,所以不会造成循环链表的问题。

1. 值覆盖问题,因为在一个数组节点上最初没有值的时候,如果一个线程给这个几点赋值的时候时间片到了,其他线程也来给这个节点赋值,最后轮到原来的线程,也复制,就把第二个线程赋值的内容给覆盖了。

相关文章
|
存储 算法 安全
HashMap底层实现原理
HashMap底层实现原理
164 0
|
5月前
|
存储 Java 测试技术
滚雪球学Java(66):Java之HashMap详解:深入剖析其底层实现与源码分析
【6月更文挑战第20天】🏆本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
44 3
滚雪球学Java(66):Java之HashMap详解:深入剖析其底层实现与源码分析
|
6月前
|
存储 Java Serverless
谈谈我对HashMap扩容机制的理解及底层实现
谈谈我对HashMap扩容机制的理解及底层实现
|
6月前
|
存储 算法 Java
深入剖析HashMap:理解Hash、底层实现与扩容机制
深入剖析HashMap:理解Hash、底层实现与扩容机制
764 1
|
存储 Java
[java进阶]——HashMap的底层实现原理和源码分析,另附几个高频面试题
[java进阶]——HashMap的底层实现原理和源码分析,另附几个高频面试题
166 0
|
存储 算法 Java
从HashMap的执行流程开始 揭开HashMap底层实现
从HashMap的执行流程开始 揭开HashMap底层实现
34 0
|
存储 安全 关系型数据库
理论:第一章:HashMap底层实现原理,红黑树,B+树,B树的结构原理,volatile关键字,CAS(比较与交换)实现原理
理论:第一章:HashMap底层实现原理,红黑树,B+树,B树的结构原理,volatile关键字,CAS(比较与交换)实现原理
241 0
理论:第一章:HashMap底层实现原理,红黑树,B+树,B树的结构原理,volatile关键字,CAS(比较与交换)实现原理
|
存储 算法 Java
HashMap的底层实现原理及其一些常用方法的总结
首先,HashSet的底层实现就是map,接下来介绍一下HashMap的底层实现原理(以jdk7和jdk8为例),HashMap的一些常用方法我整理了一下,放到了文章结束的代码块里。 先介绍jdk7的: 当 HashMap map = new HashMap(); 实例化一个对象时,其底层实际上创建了一个Entry[ ] 类型的长度为16的数组。 然后,当你map.put(key,value);往map容器中添加对象时,底层会进行以下过程: ...
108 0
HashMap的底层实现原理及其一些常用方法的总结
|
安全 算法 Java
面试必问:HashMap 底层实现原理(一)
HashMap是在面试中经常会问的一点,很多时候我们仅仅只是知道HashMap他是允许键值对都是Null,并且是非线程安全的,如果在多线程的环境下使用,是很容易出现问题的。 这是我们通常在面试中会说的,但是有时候问到底层的源码分析的时候,为什么允许为Null,为什么不安全,这些问题的时候,如果没有分析过源码的话,好像很难回答, 这样的话我们来研究一下这个源码。看看原因吧。
面试必问:HashMap 底层实现原理(一)
|
存储 安全
面试必问:HashMap 底层实现原理(二)
HashMap是在面试中经常会问的一点,很多时候我们仅仅只是知道HashMap他是允许键值对都是Null,并且是非线程安全的,如果在多线程的环境下使用,是很容易出现问题的。 这是我们通常在面试中会说的,但是有时候问到底层的源码分析的时候,为什么允许为Null,为什么不安全,这些问题的时候,如果没有分析过源码的话,好像很难回答, 这样的话我们来研究一下这个源码。看看原因吧。
面试必问:HashMap 底层实现原理(二)