面试HashMap的原理

2023-05-16

一般来说,java面试必不可少的菜品,那就是“来,讲一下HashMap的原理”  

那么今天就来讲一下HashMap的原理

先说一下JDK1.7跟JDK1.8对它的改变

  1. JDK1.7之前使用的是数组加链表,它的数据节点是一个Entry节点,它的一个内部类。HashMap JDK1.7之前的数据插入过程是使用头插法。
  2. JDK1.7跟1.8的区别就是1.7是头插法,1.8是尾插法

那么问题来了,HashMap使用头插法会造成什么问题呢?

     2. 它在调用resize它的一个扩容的过程,可能会造成在里面有一个resize的方法,它又调用了一个transfer的方法,把里面的Entry进行一个rehash

这个过程可能会造成一个链表的循环可能在下一次Get的时候出现一个死循环的情况。可能是因为没有加锁,所以也有可能多个线程并发情况下可能

数据不安全,可能我put进去,取出来还是之前的值。

下面说一下到JDK1.8的改变

  1. JDK1.8把HashMap变成一个链表加数组加红黑树的一个结构,把原的一个Entry节点也编程了一个Node节点,它的整个put的过程做了一个优化。

把改变一说,其实就差不多了解HashMap了,不知不觉中就理解了。

不过别高兴太早,如果要深究那么就要继续了解下面的内容了

HashMap的扩容机制

  1. 了解扩容机制,先了解一下Capacity这个节点,就是在初始化HashMap的时候,如果没有设置它的capacity它的默认初始容量是16,负载因子是0.75

,它会计算出一个threshold是它的一个阈值,一个扩容的阈值,如果当我在put的时候,会先检测我当前的size是不是大于这个阈值,如果大于了,会创建

出一个两倍大小的,扩大到原来两倍大,然后将原来的一个Entry进行一个resize的一个过程。

回顾一下JDK1.7是头插法,1.8是尾插法,那么头插法会死循环,线程不安全,1.8就是线程安全了吗?

面试官也许就是这样一步步的套路,你也只能是步步为营了

  1. 答案是显而易见的,不安全的,因为采用尾插法没有改变原来的数据插入的一个顺序,所以不会出现链表循环的一个过程。

已经问到这个地步了,那么肯定会问你,怎么样才能保证线程安全呢?

下面就要讲述它的一个同门师兄弟,不知师兄还是师弟哈,可以评论区留言

可以使用ConcurrentHashMap,HashTable这两个都是线程安全的,也可以加Synchronized或者Lock或Collection.Synchronize,但是ConcurrentHashMap的并发度是更高的

相对HashTable是直接对里面的方法进行了Synchronized加了一个对象锁。ConcurrentHashMap的结构就是数组加链表加红黑树,它只会锁住我目前获取到的那个Entry所在节点

的一个值,在上锁的时候也使用了CAS Synchronized JDK1.6之后对Synchronized进行一个优化锁升级的一个过程,所以他的效率是更高的。

毕竟做了那么多的事效率下降了,脸面也过不去

锁升级的过程是什么样的呢?

最开始的时候锁是支持偏向锁的,我当前获取到锁资源的这个线程会优先让它再去获取到这个锁,如果没有获取到这个锁,那么久升级成一个轻量级的,一个CAS的锁,就是

一个乐观锁,乐观锁是什么呢?乐观锁是一个比较有交换的过程,如果这个CAS没有设置成功的话,它会进行一个自旋,自旋到一定次数过后,才会升级成一个Synchroized的一个

重量级的锁,这样就保证了它的性能问题,最开始是一个无锁状态下的,然后再去检测判断去升级。

讲着讲着就越刨越深,不过面试就是这样,有些坑不知不觉就陷进去了。

如果讲有什么不对请指正,感谢支持!!!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

面试HashMap的原理 的相关文章

随机推荐

  • Idea上传项目到Git分支--解决Git pull failed问题

    就是上面这张图上的字 xff0c 困扰的我好苦好苦 今天我终于战败它了啊啊啊啊啊啊啊啊啊啊啊啊啊 xff01 xff01 上面这个呢 xff0c 大概就是说本地的文件和远程Git上的代码有冲突了 xff0c 可能会把你的替换掉 xff0c
  • Arch linux系统安装及顺手安装deepin桌面

    现在arch系统很多人都学着安装 xff0c 虽然手动性强但还是很好安装的 安装方式有两种 xff0c 一种是使用archinstall xff0c 可以说是个半自动 安装方法 xff0c 只要能上网 xff0c 前期设置好了 xff0c
  • 【C++服务器入门基础------4.IPC进程间通信--管道】

    大学生寒假在家过于无聊 xff0c 整理一下以前学过的知识 xff0c 顺便复习一下 xff0c 水平较低 xff0c 专业性差 xff0c 仅供参考 xff0c 不喜勿喷 xff08 反正也没人看 xff09 连续一周多出去泡妞了 xff
  • 浅谈Binder

    参考文章 xff1a https blog csdn net ly0724ok article details 117566381 ps xff1a 强烈推荐这篇文章 xff0c 写得很仔细 xff0c 图文结合 xff0c 一看就懂 xf
  • git或svn查看远程源地址

    git查看 xff1a git remote v svn 查看 svn info 转载 git或svn查看远程源地址 https www cnblogs com jiwd p 12504815 html
  • Linux登录一直报login incorrect问题及我的解决方案

    Linux登录一直报login incorrect问题及我的解决方案 打开VMware xff0c 启动虚拟机 xff0c Linux登录 xff0c 输入用户名和密码 xff0c 报Login incorrect 难道我输错了 xff1f
  • Spring-依赖注入(IOC)

    SPRING 一 依赖注入 xff08 IOC xff09 1 什么是依赖注入 xff08 1 xff09 我们经常说的控制反转 xff08 Inversion of Control IOC xff09 和依赖注入 xff08 Depend
  • 使用Vmware虚拟机无法ping通开发板

    文章同时发布于个人博客https www shui2000 top posts 76f723b3 html 问题详细描述 嵌入式课程中 xff0c 本人使用Vmware虚拟机运行Ubuntu22 04操作系统 xff0c 无法与开发版pin
  • 深入浅析MyBatis源码

    MyBatis 1 SqlSessionFactoryBuilder 通过build方法去解析xml配置文件 通过调用XMLConfigBuilder的parse方法将配置文件封装成一个Configuration对象 Xml节点解析 封装好
  • java 无需SSL验证的HTTP请求

    实例 如果有用请给我个赞好吗 public static Map lt String Object gt doPost String url Map lt String String gt paramaters HttpPost httpR
  • Kafta原理

    消息队列通信的模式 通过上面的例子我们引出了消息中间件 xff0c 并且介绍了消息队列出现后的好处 xff0c 这里就需要介绍消息队列通信的两种模式了 xff1a 一 点对点模式 如上图所示 xff0c 点对点模式通常是基于拉取或者轮询的消
  • MapStruct简介简单应用

    1 MapStruct 是什么 xff1f 1 1 JavaBean 的困扰 对于代码中 code JavaBean code 之间的转换 xff0c 一直是困扰我很久的事情 在开发的时候我看到业务代码之间有很多的 code JavaBea
  • SpringBoot入门案例

    基础项目该包含哪些东西 Swagger在线接口文档 CodeGenerator 代码生成器 统一返回 通用的分页对象 常用工具类 全局异常拦截 错误枚举 自定义异常 多环境配置文件 Maven多环境配置 日志配置 JenkinsFile S
  • Spring事务管理机制

    一 Spring事务管理的几种方式 xff1a Spring事务在具体使用方式上可分为两大类 xff1a 1 声明式 基于 TransactionProxyFactoryBean的声明式事务管理 基于 lt tx gt 和 lt aop g
  • SpringBoot 注解大全

    一 注解 annotations 列表 1 64 SpringBootApplication 包含了 64 ComponentScan 64 Configuration和 64 EnableAutoConfiguration注解 其中 64
  • Spring 中的bean 是否线程安全

    结论 xff1a 不是线程安全的 Spring容器中的Bean是否线程安全 xff0c 容器本身并没有提供Bean的线程安全策略 xff0c 因此可以说Spring容器中的Bean本身不具备线程安全的特性 xff0c 但是具体还是要结合具体
  • SpringBoot使用PageHelper分页

    一 开发准备 1 开发工具 IntelliJ IDEA 2020 2 3 2 开发环境 Red Hat Open JDK 8u256 Apache Maven 3 6 3 3 开发依赖 SpringBoot lt dependency gt
  • Windows Server 出现多个匿名登陆用户的问题解决

    1 起因 工作中需要在同一台 windows server的机器上多个用户同时使用 xff0c 遂建立多个账号 xff0c 供大家进行使用 2 问题 一段时间后发现系统特别卡顿并会死机 xff0c 查询原因后发现 xff0c 如图所示 xf
  • java锁 synchronized的使用及原理剖析

    synchronized用法有三个 修饰实例方法 修饰静态方法 修饰代码块 1 修饰实例方法 synchronized关键词作用在方法的前面 xff0c 用来锁定方法 xff0c 其实默认锁定的是this对象 public class Th
  • 面试HashMap的原理

    一般来说 xff0c java面试必不可少的菜品 xff0c 那就是 来 xff0c 讲一下HashMap的原理 那么今天就来讲一下HashMap的原理 先说一下JDK1 7跟JDK1 8对它的改变 JDK1 7之前使用的是数组加链表 xf