首页 > 其他分享 >大厂面试真题-说说jdk1.7和1.8的hashmap的区别以及各自的问题

大厂面试真题-说说jdk1.7和1.8的hashmap的区别以及各自的问题

时间:2024-10-17 20:46:05浏览次数:8  
标签:扩容 1.7 hashmap JDK 真题 1.8 链表 HashMap

JDK 1.7和JDK 1.8中的HashMap存在显著的区别,并且各自存在一些问题。以下是对两者的详细对比及问题分析:

一、区别

  1. 底层数据结构

    • JDK 1.7:HashMap的底层结构是由数组(也被称为“位桶”)和链表构成。当hash冲突时,不同的key映射到数组的同一位置,则形成链表。
    • JDK 1.8:HashMap的底层结构是数组+链表/红黑树。当链表长度超过一定阈值(默认为8)时,链表会转换为红黑树,以提高查询效率。
  2. 初始化与扩容

    • JDK 1.7:当哈希表为空时,会先调用inflateTable()初始化一个数组;扩容时是先扩容后插入新值,而且扩容时可能会改变链表中元素的顺序。
    • JDK 1.8:直接调用resize()进行扩容;扩容时是先插值再扩容,并且在扩容时会保持链表元素原本的顺序。
  3. 插入数据方式

    • JDK 1.7:采用头插法插入键值对,由于使用单链表进行的纵向延伸,采用头插法时容易出现逆序且环形链表死循环问题。
    • JDK 1.8:将节点插入到链表尾部,由于加入了红黑树并使用尾插法,能够避免出现逆序且链表死循环的问题。
  4. Hash值计算

    • JDK 1.7:Hash函数对哈希值的计算直接使用key的hashCode值。
    • JDK 1.8:采用key的hashCode异或上key的hashCode进行无符号右移16位的结果,避免了只靠低位数据来计算哈希时导致的冲突,计算结果由高低位结合决定,使元素分布更均匀。
  5. 扩容策略

    • JDK 1.7:当元素个数不小于阈值(即容量*负载因子)时,直接扩容2倍。
    • JDK 1.8:当数组容量未达到64时,以2倍进行扩容;超过64之后若桶中元素个数大于6就将链表转换为红黑树,但如果红黑树中的元素个数小于6就会还原为链表;当红黑树中元素不小于32的时候才会再次扩容。
  6. 对null的处理

    • JDK 1.7:null是一个特殊的值,单独处理。
    • JDK 1.8:null的hash值计算结果为0,其他地方和普通的key没区别。
  7. Hash值的可变性

    • JDK 1.7:hash是可变的,因为存在rehash操作。
    • JDK 1.8:hash是final修饰的,即hash值一旦确定就不会再重新计算。

二、各自的问题

  1. JDK 1.7 HashMap的问题

    • 死循环和数据丢失:由于JDK 1.7采用头插法插入键值对,当进行扩容时,可能会出现逆序的链表,进而可能导致环形链表和死循环的问题。此外,这种插入方式在扩容时也可能导致数据丢失。
    • Hash算法的复杂性:JDK 1.7的Hash算法相对复杂,包括多次位运算和异或运算,这可能影响HashMap的性能。
  2. JDK 1.8 HashMap的问题

    • 红黑树的转换开销:虽然JDK 1.8引入了红黑树来优化查询性能,但当链表转换为红黑树或红黑树还原为链表时,需要额外的开销。
    • 线程不安全:与JDK 1.7一样,JDK 1.8的HashMap也是线程不安全的。在多线程环境下使用时,可能会出现数据不一致的问题。因此,在高并发场景下,需要考虑使用线程安全的替代方案,如ConcurrentHashMap

1.7和1.8的线程不安全的问题可以查看这篇文章:大厂面试真题-具体说说jdk1.7和1.8的hashmap的线程不安全都有什么问题-CSDN博客

综上所述,JDK 1.7和JDK 1.8中的HashMap在底层数据结构、初始化与扩容、插入数据方式、Hash值计算、扩容策略、对null的处理以及节点和Hash值等方面存在显著差异。这些改进使得JDK 1.8中的HashMap在性能和功能上都有了显著提升,但仍然存在一些潜在的问题需要注意和解决。

标签:扩容,1.7,hashmap,JDK,真题,1.8,链表,HashMap
From: https://blog.csdn.net/Chang_Yafei/article/details/142992224

相关文章

  • java_day14_HashSet、TreeSet、增强for循环、Map、HashMap、TreeMap、可变参数
    一、HashSetSet:HashSet:底层数据结构是哈希表,查找速度快,且元素唯一HashSet中的add方法实际上调用的是HashMap中的put方法底层和元素的hashCode方法值有关我们发现,底层判断待插入的元素是否已经存在哈希表中的方式是:将待插入的元素的哈希值与已经存......
  • Java算法竞赛之HashMap常用API--哈西表!
    在Java算法竞赛中,HashMap是一个非常重要的数据结构,它提供了许多有用的API来方便地进行键值对的存储、检索和更新。除了getOrDefault方法外,HashMap还有其他一些常用的API。以下是一些主要的HashMapAPI及其在算法竞赛中的常见用法:put(Kkey,Vvalue)作用:将指定的键与值放入H......
  • Map中的具体实现子类HashMap
    一、HashMapHashMap<Student3,String>Map的唯一性指的是键的唯一性,HashMap中需要键的类型要重写hashCode()方法和equals方法二、HashMap的使用1.编写Student3类,里面需要重写hashCode()方法和equals方法importjava.util.Objects;publicclassStudent3{privateStrin......
  • jdk1.6,jdk1.7,jdk1.8安装共存问题
    1.今天遇到了需要编辑开发公司老项目的情况,之前本人电脑就装了1.6和1.8的jdk,现在老项目优需要安装jdk1.7运行,便有了这个问题,再次记录下2.首先需要安装对应的jdk,以及环境变量,我这里只展示三者共存的环境变量设置,其余单一的配置环境变量,网上都有就不在此啰嗦了3.用JAVA_H......
  • 真题练习4-Excel电子表格-全国计算机等级考试一级计算机基础及MS Office应用考试【汪
    题目请根据题目要求,完成下列操作:注意:以下的文件必须保存在考生文件夹下1.打开工作簿文件EXCEL.XLSX。(1)将sheet1工作表的A1:E1单元格合并为一个单元格,内容水平居中;计算实测值与预测值之间的误差的绝对值放置于“误差(绝对值)”列;评估“预测准确度”列,评估规则为:“误差”低于或......
  • 华为OD机试真题-最佳种树距离-2024年OD统一考试(E卷)
    最新华为OD机试考点合集:华为OD机试2024年真题题库(E卷+D卷+C卷)_华为od机试题库-CSDN博客     每一题都含有详细的解题思路和代码注释,精编c++、JAVA、Python三种语言解法。帮助每一位考生轻松、高效刷题。订阅后永久可看,发现新题及时跟新。题目描述按照环保公司要求,小明......
  • ArrayList源码分析(底层数据结构,成员变量,构造方法)以及面试题(基于JDK1.8)
    要分析Arraylist,我们首先要从它的底层数据结构实现出发,再结合其底层源码,可能能让读者理解的更加深刻一点。1,底层数据结构(数组)Arraylist底层是基于动态数组实现的。数组是一种使用连续储存空间储存相同数据类型的线性数据结构。面试题1为什么数组索引从0开始不从1开始?分......
  • 2025秋招NLP算法面试真题(二十二)-大模型参数高效微调技术总结与对比
    目录当前高效微调技术的简述BitFitPrefixTuningPromptTuningP-TuningP-Tuningv2AdapterTuningAdapterFusionAdapterDropLoRAAdaLoRA<......
  • java中HashMap扩容机制详解(扩容的背景、触发条件、扩容的过程、扩容前后的对比、性能
    在Java中,HashMap是一个非常常用的数据结构,基于哈希表实现,它通过键值对的形式存储数据。为了保证其操作的效率,HashMap采用了一种动态扩容机制。当HashMap中元素数量增长到一定程度时,会自动进行扩容。本文将详细讲解HashMap的扩容机制,包括其触发条件、过程、及扩容过程中可能......
  • 《csp-j2024初赛真题》 解析
    温馨提醒,以下解析为个人观点,还是得请大佬多多指教(可以喷,但不能说我是复制粘贴!)这篇文章的背景故事:我的那些朋友去给另一个朋友过生日聚会,现在刚刚走回来。那你们知道我为啥不去吗给你们看张珍贵无比的图片: 当然,不止这两张。至于原因,我要回来赶(肝)(干)解析(哭脸)1.32位int......