作者|依本多情

原文:blog.csdn.net/qq_36520235/article/details/82417949

一、真实面试题之:Hashmap的结构,1.7和1.8有哪些区别

不同点:

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

(2)扩容后数据存储位置的计算方式也不一样:

  1. 在JDK1.7的时候是直接用hash值和需要扩容的二进制数进行&(这里就是为什么扩容的时候为啥一定必须是2的多少次幂的原因所在,因为如果只有2的n次幂的情况时最后一位二进制数才一定是1,这样能最大程度减少hash碰撞)(hash值 & length-1)。

  2. 而在JDK1.8的时候直接用了JDK1.7的时候计算的规律,也就是扩容前的原始位置+扩容的大小值=JDK1.8的计算方式,而不再是JDK1.7的那种异或的方法。但是这种方式就相当于只需要判断Hash值的新增参与运算的位是0还是1就直接迅速计算出了扩容后的储存方式。

在计算hash值的时候,JDK1.7用了9次扰动处理=4次位运算+5次异或,而JDK1.8只用了2次扰动处理=1次位运算+1次异或。

扩容流程对比图:

(3)JDK1.7的时候使用的是数组+ 单链表的数据结构。但是在JDK1.8及之后时,使用的是数组+链表+红黑树的数据结构(当链表的深度达到8的时候,也就是默认阈值,就会自动扩容把链表转成红黑树的数据结构来把时间复杂度从O(n)变成O(logN)提高了效率)。

这里再进行补充两个问题:

(1)为什么在JDK1.7的时候是先进行扩容后进行插入,而在JDK1.8的时候则是先插入后进行扩容的呢?

//其实就是当这个Map中实际插入的键值对的值的大小如果大于这个默认的阈值的时候(初始是16*0.75=12)的时候才会触发扩容,//这个是在JDK1.8中的先插入后扩容if (++size > threshold)            resize();

其实这个问题也是JDK8对HashMap中,主要是因为对链表转为红黑树进行的优化,因为你插入这个节点的时候有可能是普通链表节点,也有可能是红黑树节点,但是为什么1.8之后HashMap变为先插入后扩容的原因,我也有点不是很理解?欢迎来讨论这个问题?

但是在JDK1.7中的话,是先进行扩容后进行插入的,就是当你发现你插入的桶是不是为空,如果不为空说明存在值就发生了hash冲突,那么就必须得扩容,但是如果不发生Hash冲突的话,说明当前桶是空的(后面并没有挂有链表),那就等到下一次发生Hash冲突的时候在进行扩容,但是当如果以后都没有发生hash冲突产生,那么就不会进行扩容了,减少了一次无用扩容,也减少了内存的使用。

void addEntry(int hash, K key, V value, int bucketIndex) {        //这里当钱数组如果大于等于12(假如)阈值的话,并且当前的数组的Entry数组还不能为空的时候就扩容      if ((size >= threshold) && (null != table[bucketIndex])) {       //扩容数组,比较耗时          resize(2 * table.length);          hash = (null != key) ? hash(key) : 0;          bucketIndex = indexFor(hash, table.length);      }

      createEntry(hash, key, value, bucketIndex);  }

 void createEntry(int hash, K key, V value, int bucketIndex) {      Entry e = table[bucketIndex];//把新加的放在原先在的前面,原先的是e,现在的是new,next指向e      table[bucketIndex] = new Entry<>(hash, key, value, e);//假设现在是new      size++;  }

(2)为什么在JDK1.8中进行对HashMap优化的时候,把链表转化为红黑树的阈值是8,而不是7或者不是20呢(面试蘑菇街问过)?

如果选择6和8(如果链表小于等于6树还原转为链表,大于等于8转为树),中间有个差值7可以有效防止链表和树频繁转换。假设一下,如果设计成链表个数超过8则链表转换成树结构,链表个数小于8则树结构转换成链表,如果一个HashMap不停的插入、删除元素,链表个数在8左右徘徊,就会频繁的发生树转链表、链表转树,效率会很低。

还有一点重要的就是由于treenodes的大小大约是常规节点的两倍,因此我们仅在容器包含足够的节点以保证使用时才使用它们,当它们变得太小(由于移除或调整大小)时,它们会被转换回普通的node节点,容器中节点分布在hash桶中的频率遵循泊松分布,桶的长度超过8的概率非常非常小。所以作者应该是根据概率统计而选择了8作为阀值。

    //Java中解释的原因   * Because TreeNodes are about twice the size of regular nodes, we     * use them only when bins contain enough nodes to warrant use     * (see TREEIFY_THRESHOLD). And when they become too small (due to     * removal or resizing) they are converted back to plain bins.  In     * usages with well-distributed user hashCodes, tree bins are     * rarely used.  Ideally, under random hashCodes, the frequency of     * nodes in bins follows a Poisson distribution     * (http://en.wikipedia.org/wiki/Poisson_distribution) with a     * parameter of about 0.5 on average for the default resizing     * threshold of 0.75, although with a large variance because of     * resizing granularity. Ignoring variance, the expected     * occurrences of list size k are (exp(-0.5) * pow(0.5, k) /     * factorial(k)). The first values are:     *     * 0:    0.60653066     * 1:    0.30326533     * 2:    0.07581633     * 3:    0.01263606     * 4:    0.00157952     * 5:    0.00015795     * 6:    0.00001316     * 7:    0.00000094     * 8:    0.00000006     * more: less than 1 in ten million

二、哈希表如何解决Hash冲突?

三、为什么HashMap具备下述特点:键-值(key-value)都允许为空、线程不安全、不保证有序、存储位置随时间变化

四、为什么 HashMap 中 String、Integer 这样的包装类适合作为 key 键

五、HashMap 中的 key若 Object类型, 则需实现哪些方法?

【面试题专栏】

吃透这份pdf,面试阿里、腾讯、百度等一线大厂,顺利拿下心仪offer!

全网最全Spring系列面试题129道(附答案解析)

2万字Java并发编程面试题整理(含答案,建议收藏)

85道Java微服务面试题整理(助力2020面试)

【2020年大厂面试必备】JVM与性能调优知识点整理

2019年面试官最喜欢问的28道ZooKeeper面试题

2019年全网最热门的123个Java并发面试题总结

全网最热门的119个Spring问题,哪些你还不会?

2020面试还搞不懂MyBatis?看看这27道面试题!(含答案和思维导图)

2020年去一线大厂面试先过SSM框架这一关!

Spring Cloud+Spring Boot高频面试题解析

2019年常见的Linux面试题及答案解析,哪些你还不会?

2019年常见Elasticsearch面试题答案解析

18道kafka高频面试题哪些你还不会?(含答案和思维导图)

2019年12道RabbitMQ高频面试题你都会了吗?(含答案解析)

2019年Dubbo你掌握的如何?快看看这30道高频面试题!

2019年228道Java中高级面试题(8),哪些你还不会?

 你在看吗?

hashmap value可以为空吗_美团面试题:Hashmap结构,1.7和1.8有哪些区别(最详细解析)...相关推荐

  1. hashmap中的key是有序的么_美团面试题:Hashmap结构,1.7和1.8有哪些区别(史上最最详细解析)...

    作者|依本多情 原文:blog.csdn.net/qq_36520235/article/details/82417949 一.真实面试题之:Hashmap的结构,1.7和1.8有哪些区别 不同点: ...

  2. @bean注解和@component注解的区别_阿里面试题一:spring里面使用xml配置和注解配置区别...

    阿里是众多程序员梦寐以求的地方,今天我们分享阿里的一个真实面试题,看似简单,回答起来确实没有头绪?下面我们分几点给大家说下答案. 适用场景 Xml配置场景: 1.Bean实现类来源于第三方类库,如Da ...

  3. hashmap修改对应key的值_死磕 java集合之HashMap源码分析

    简介 HashMap采用key/value存储结构,每个key对应唯一的value,查询和修改的速度都很快,能达到O(1)的平均时间复杂度.它是非线程安全的,且不保证元素存储的顺序: 继承体系 Has ...

  4. 中数组的合并_【美团面试题】合并两个有序数组

    [美团面试题]合并两个有序数组 题目描述 给你两个有序整数数组 nums1 和 nums2,请你将 nums2 合并到 nums1 中,使 nums1 成为一个有序数组 划重点 初始化 nums1 和 ...

  5. Hashmap 面试题 + Hashmap 原理 + Hashmap 源码(史上最全)

    HashMap作为我们日常使用最频繁的容器之一,相信你一定不陌生了.今天我们就从HashMap的底层实现讲起,深度了解下它的设计与优化. 常用的数据结构 我在05讲分享List集合类的时候,讲过Arr ...

  6. 详细解析:HashMap源码剖析

    目录: 一.HashMap概述二.HashMap的数据结构三.HashMap源码分析 1.关键属性 2.构造方法 3.存储数据 4.调整大小 5.数据读取 6.HashMap的性能参数 7.Fail- ...

  7. 美团面试题:JVM 堆内存溢出后,其他线程是否可继续工作?

    作者:gosaintmrc 来源:http://sina.lt/gqaM 最近网上出现一个美团面试题:"一个线程OOM后,其他线程还能运行吗?" 我看网上出现了很多不靠谱的答案.这 ...

  8. 科学计算机程序 字表处理软件都是,计算机应用基础知识_计算机应用基础试题及答案【最新资料】.doc...

    计算机应用基础知识_计算机应用基础试题及答案[最新资料] 计算机应用基础知识 计算机应用基础试题及答案 ? 计算机应用基础知识1.1填空题1.第一代计算机采用的电子器件是--[答案] 电子管2.第四代 ...

  9. 2009.5.23软考_系统分析师 上午试题 答案 讨论

    2009.5.23软考_系统分析师 上午试题 答案 讨论 不求尽如人意,但求无愧我心.不断更新中,敬请持续关注--

最新文章

  1. 基于CUDA实现立方体贴图 (Cubemaps) 转换为全景图 (Equirectangular Panorama)
  2. Pulltorefresh使用中碰到的问题
  3. 深入理解Java Class反射机制
  4. hibernate -- HQL语句总结
  5. java基础求三角形的面积
  6. 苏州的高铁旅游的基本调查
  7. HALCON示例程序class_ndim_box.hdev基于多通道图像的分类
  8. matlab安装MinGW-64代码C/C++编译器的方法
  9. 在VS2012中实现Ext JS的智能提示
  10. python私有化方法_Python 私有化
  11. Atitit Java内容仓库(Java Content Repository,JCR)的JSR-170 文件存储api标准 目录 1. Java内容仓库 1 2. Java内容仓库 2 2.1.
  12. 支付宝免签在线支付要饭教程
  13. 【JAVA】数据结构——堆的排序及相关面试题
  14. spring cloud oauth2 资源服务器配置
  15. 内网计算机ip地址查询,内网ip地址怎么查看_怎么查看内网ip地址_如何查看电脑的内网IP地址...
  16. PAT 甲级 1048 Find Coins
  17. 安装 deepin系统 实现windows和deepin双系统
  18. flutter - 强制横屏/竖屏
  19. 论文阅读 [TPAMI-2022] ManifoldNet: A Deep Neural Network for Manifold-Valued Data With Applications
  20. 区块链热点!STO被政府严令禁止

热门文章

  1. AIFramework框架Jittor特性(上)
  2. 多传感器融合:自动驾驶(上)
  3. NVIDIA安倍架构
  4. 自动驾驶系统关系与自动泊车原理
  5. 计算机组成原理-第二章 数据表示与运算
  6. 客快物流大数据项目(四十六):Spark操作Kudu dataFrame操作kudu
  7. 中文版证书_CIA考试多久后才可以领取证书?领取的方式是什么?
  8. python 判断字符串是否为空,字典是否为空,列表是否为空,元组是否为空的方法
  9. android studio导入第三方库和demo
  10. C#日期格式精确到毫秒 !!