HashMap相关面试题

串口通信协议 文章目录前言一、串口通信结构图二、电平三、串口通信协议 前言 本文记录的是平时常用的串口通信有关知识点 提示:以下是本篇文章正文内容,下面案例可供参考 一、串口通信结构图 1、RS232标准串口通讯结构图 2、USB转串口通讯结构图 3、原生的串口到串口 二、电平 串口通信的时候,有三种电平:TTL电平、RS232电平、USB电平 TTL电平是从MCU直接出来的电平 RS323是一种通讯标准,因为高电平+15V低电平–15V电位差30V容错空间大,抗干扰能力强,一般用于工业设备直接通信电平转换芯 阅读详情

JDK8中的HashMap与JDK7的HashMap有什么不一样?

  1. JDK8中新增了红黑树,JDK8是通过数组+链表+红黑树来实现的
  2. JDK7中链表的插入是用的头插法,而JDK8中则改为了尾插法
  3. JDK8中的因为使用了红黑树保证了插入和查询了效率,所以实际上JDK8中的Hash算法实现的复杂度降低了
  4. JDK8中数组扩容的条件也发了变化,只会判断是否当前元素个数是否超过了阈值,而不再判断当前put进来的元素对应的数组下标位置是否有值。
  5. JDK7中是先扩容再添加新元素,JDK8中是先添加新元素然后再扩容

HashMap中PUT方法的流程?

  1. 通过key计算出一个hashcode
  2. 通过hashcode与“与操作”计算出一个数组下标
  3. 在把put进来的key,value封装为一个entry对象
  4. 判断数组下标对应的位置,是不是空,如果是空则把entry直接存在该数组位置
  5. 如果该下标对应的位置不为空,则需要把entry插入到链表中
  6. 并且还需要判断该链表中是否存在相同的key,如果存在,则更新value
  7. 如果是JDK7,则使用头插法
  8. 如果是JDK8,则会遍历链表,并且在遍历链表的过程中,统计当前链表的元素个数,如果超过8个,则先把链表转变为红黑树,并且把元素插入到红黑树中

JDK8中链表转变为红黑树的条件?

  1. 链表中的元素的个数为8个或超过8个
  2. 同时,还要满足当前数组的长度大于或等于64才会把链表转变为红黑树。为什么?因为链表转变为红黑树的目的是为了解决链表过长,导致查询和插入效率慢的问题,而如果要解决这个问题,也可以通过数组扩容,把链表缩短也可以解决这个问题。所以在数组长度还不太长的情况,可以先通过数组扩容来解决链表过长的问题。

HashMap扩容流程是怎样的?

  1. HashMap的扩容指的就是数组的扩容, 因为数组占用的是连续内存空间,所以数组的扩容其实只能新开一个新的数组,然后把老数组上的元素转移到新数组上来,这样才是数组的扩容
  2. 在HashMap中也是一样,先新建一个2倍数组大小的数组
  3. 然后遍历老数组上的每一个位置,如果这个位置上是一个链表,就把这个链表上的元素转移到新数组上去
  4. 在这个过程中就需要遍历链表,当然jdk7,和jdk8在这个实现时是有不一样的,jdk7就是简单的遍历链表上的每一个元素,然后按每个元素的hashcode结合新数组的长度重新计算得出一个下标,而重新得到的这个数组下标很可能和之前的数组下标是不一样的,这样子就达到了一种效果,就是扩容之后,某个链表会变短,这也就达到了扩容的目的,缩短链表长度,提高了查询效率
  5. 而在jdk8中,因为涉及到红黑树,这个其实比较复杂,jdk8中其实还会用到一个双向链表来维护红黑树中的元素,所以jdk8中在转移某个位置上的元素时,会去判断如果这个位置是一个红黑树,那么会遍历该位置的双向链表,遍历双向链表统计哪些元素在扩容完之后还是原位置,哪些元素在扩容之后在新位置,这样遍历完双向链表后,就会得到两个子链表,一个放在原下标位置,一个放在新下标位置,如果原下标位置或新下标位置没有元素,则红黑树不用拆分,否则判断这两个子链表的长度,如果超过八,则转成红黑树放到对应的位置,否则把单向链表放到对应的位置。
  6. 元素转移完了之后,在把新数组对象赋值给HashMap的table属性,老数组会被回收到。

为什么HashMap的数组的大小是2的幂次方数?

JDK7的HashMap是数组+链表实现的
JDK8的HashMap是数组+链表+红黑树实现的

当某个key-value对需要存储到数组中时,需要先生成一个数组下标index,并且这个index不能越界。

在HashMap中,先得到key的hashcode,hashcode是一个数字,然后通过 hashcode & (table.length - 1) 运算得到一个数组下标index,是通过与运算计算出来一个数组下标的,而不是通过取余,与运算相比于取余运算速度更快,但是也有一个前提条件,就是数组的长度得是一个2的幂次方数。

ConcurrentHashMap相关面试题

ConcurrentHashMap和HashMap的区别是什么?

ConcurrentHashMap是HashMap的升级版,HashMap是线程不安全的,而ConcurrentHashMap是线程安全。而其他功能和实现原理和HashMap类似。

JDK8的ConcurrentHashMap和JDK7的ConcurrentHashMap有什么区别?

JDK8中新增了红黑树
JDK7中使用的是头插法,JDK8中使用的是尾插法
JDK7中使用了分段锁,而JDK8中没有使用分段锁了
JDK7中使用了ReentrantLock,JDK8中没有使用ReentrantLock了,而使用了Synchronized
JDK7中的扩容是每个Segment内部进行扩容,不会影响其他Segment,而JDK8中的扩容和HashMap的扩容类似,只不过支持了多线程扩容,并且保证了线程安全

ConcurrentHashMap是如何保证并发安全的?

JDK7中ConcurrentHashMap是通过ReentrantLock+CAS+分段思想来保证的并发安全的,在JDK7的ConcurrentHashMap中,首先有一个Segment数组,存的是Segment对象,Segment相当于一个小HashMap,Segment内部有一个HashEntry的数组,也有扩容的阈值,同时Segment继承了ReentrantLock类,同时在Segment中还提供了put,get等方法,比如Segment的put方法在一开始就会去加锁,加到锁之后才会把key,value存到Segment中去,然后释放锁。
同时在ConcurrentHashMap的put方法中,会通过CAS的方式把一个Segment对象存到Segment数组的某个位置中。
同时因为一个Segment内部存在一个HashEntry数组,所以和HashMap对比来看,相当于分段了,每段里面是一个小的HashMap,每段公用一把锁,同时在ConcurrentHashMap的构造方法中是可以设置分段的数量的,叫做并发级别concurrencyLevel.
JDK8中ConcurrentHashMap是通过synchronized+cas来实现了。在JDK8中只有一个数组,就是Node数组,Node就是key,value,hashcode封装出来的对象,和HashMap中的Entry一样,在JDK8中通过对Node数组的某个index位置的元素进行同步,达到该index位置的并发安全。同时内部也利用了CAS对数组的某个位置进行并发安全的赋值。
JDK8中的ConcurrentHashMap为什么使用synchronized来进行加锁?
JDK8中使用synchronized加锁时,是对链表头结点和红黑树根结点来加锁的,而ConcurrentHashMap会保证,数组中某个位置的元素一定是链表的头结点或红黑树的根结点,所以JDK8中的ConcurrentHashMap在对某个桶进行并发安全控制时,只需要使用synchronized对当前那个位置的数组上的元素进行加锁即可,对于每个桶,只有获取到了第一个元素上的锁,才能操作这个桶,不管这个桶是一个链表还是红黑树。
想比于JDK7中使用ReentrantLock来加锁,因为JDK7中使用了分段锁,所以对于一个ConcurrentHashMap对象而言,分了几段就得有几个ReentrantLock对象,表示得有对应的几把锁。
而JDK8中使用synchronized关键字来加锁就会更节省内存,并且jdk也已经对synchronized的底层工作机制进行了优化,效率更好。

JDK7中的ConcurrentHashMap是如何扩容的?

JDK7中的ConcurrentHashMap和JDK7的HashMap的扩容是不太一样的,首先JDK7中也是支持多线程扩容的,原因是,JDK7中的ConcurrentHashMap分段了,每一段叫做Segment对象,每个Segment对象相当于一个HashMap,分段之后,对于ConcurrentHashMap而言,能同时支持多个线程进行操作,前提是这些操作的是不同的Segment,而ConcurrentHashMap中的扩容是仅限于本Segment,也就是对应的小型HashMap进行扩容,所以是可以多线程扩容的。
每个Segment内部的扩容逻辑和HashMap中一样。

JDK8中的ConcurrentHashMap是如何扩容的?

首先,JDK8中是支持多线程扩容的,JDK8中的ConcurrentHashMap不再是分段,或者可以理解为每个桶为一段,在需要扩容时,首先会生成一个双倍大小的数组,生成完数组后,线程就会开始转移元素,在扩容的过程中,如果有其他线程在put,那么这个put线程会帮助去进行元素的转移,虽然叫转移,但是其实是基于原数组上的Node信息去生成一个新的Node的,也就是原数组上的Node不会消失,因为在扩容的过程中,如果有其他线程在get也是可以的。

JDK8中的ConcurrentHashMap有一个CounterCell,你是如何理解的?

CounterCell是JDK8中用来统计ConcurrentHashMap中所有元素个数的,在统计ConcurentHashMap时,不能直接对ConcurrentHashMap对象进行加锁然后再去统计,因为这样会影响ConcurrentHashMap的put等操作的效率,在JDK8的实现中使用了CounterCell+baseCount来辅助进行统计,baseCount是ConcurrentHashMap中的一个属性,某个线程在调用ConcurrentHashMap对象的put操作时,会先通过CAS去修改baseCount的值,如果CAS修改成功,就计数成功,如果CAS修改失败,则会从CounterCell数组中随机选出一个CounterCell对象,然后利用CAS去修改CounterCell对象中的值,因为存在CounterCell数组,所以,当某个线程想要计数时,先尝试通过CAS去修改baseCount的值,如果没有修改成功,则从CounterCell数组中随机取出来一个CounterCell对象进行CAS计数,这样在计数时提高了效率。
所以ConcurrentHashMap在统计元素个数时,就是baseCount加上所有CountCeller中的value只,所得的和就是所有的元素个数。

个人总结:

HaspMap线程不安全。
HashTable线程安全但是效率低因为他会通过synchronized来锁住整个数组导致效率低一般不会去用。
ConcurrentHashMap是线程安全的。

JDK1.7中HashMap

首先put时会通过key生成一个hashCode值然后通过与运算(hashCode & table.length-1)来找到index然后生成Entry对象,然后回去判断对应table[index]是否有值,如果没有则插入,如果有则会遍历链表看是否存在相同的key有则替换没有则插入(使用头插法)。
扩容是先去看是否达到阈值,如果到阈值先新建一个2倍数组大小的数组然后按每个元素的hashcode结合新数组的长度重新计算得出一个下标,而重新得到的这个数组下标很可能和之前的数组下标是不一样的,这样子就达到了一种效果,就是扩容之后,某个链表会变短,这也就达到了扩容的目的,缩短链表长度,提高了查询效率。

JDK1.7中ConcurrentHashMap

ReentrantLock

如何在 R 中执行 Kruskal-Wallis 检验 Kruskal-Wallis 检验用于确定三个或更多独立组的中位数之间是否存在统计学上的显着差异。它被认为是单向方差分析的非参数等效项。本教程介绍了如何在 R 中执行 Kruskal-Wallis 检验。示例:R 中的 Kruskal-Wallis 检验 假设研究人员想知道三种不同的肥料是否会导致不同水平的植物生长。他们随机选择 30 种不同的植物并将它们分成三组,每组 10 株,每组施用不同的肥料。在一个月结束时,他们测量每株植物的高度。使用以下步骤执行 Kruskal-Wallis 检验以确定三个组的中 阅读详情

相关推荐

FastGPT 引申:借鉴 FastGPT 基于MySQL + ES 实现知识库(含表结构以及核心代码)

FastGPT 引申:借鉴 FastGPT 基于MySQL + ES 实现知识库(含表结构以及核心代码)

蜗牛的专栏 3434

hashmap相关面试题

转载于:https://www.cnblogs.com/MJyc/p/10399158.html

weixin_33690367的博客 145

告别编译报错!手把手教你用VS2022命令行编译curl静态库(附完整测试代码)

本文详细介绍了如何在VS2022环境下通过命令行编译curl静态库,从环境准备、编译实战到项目集成,提供了完整的避坑指南和测试代码。特别针对常见的编译报错如LNK2019等给出了具体解决方案,帮助开发者高效完成网络库的静态编译与集成。

weixin_42557803的博客 446

常见HashMap相关面试题

详细: 常见HashMap相关面试题

qq_46027706的博客 387

嘉立创EDA报错:元件引脚与焊盘未对应报错解决记录

原件引脚与焊盘未对应报错解决方法,一文总结!

2303_77013775的博客 1万+

【AI 赋能:Python 人工智能应用实战】16. BERT微调实战:中文新闻分类全流程(附模型蒸馏+ONNX部署完整代码)

中文新闻分类是NLP领域的经典实用任务,BERT模型凭借双向上下文建模能力,能有效解决中文歧义与长文本依赖问题,但存在推理速度慢、资源占用高的痛点。本文以THUCNews中文新闻数据集为核心,提供从数据预处理、BERT微调、模型蒸馏到生产部署的全流程实操指南。首先详解THUCNews的多编码读取与清洗(解决gbk/utf-8兼容问题);然后实现BERT微调,加入早停机制与混淆矩阵可视化,验证准确率达93.8%;接着用DistilBERT完成模型蒸馏,在仅损失0.6%准确率的前提下,将推理速度提升2.7倍。

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 1096

HashMap、HashTable及ConcurrentHashMap区别及相关面试题

HashMap、HashTable及ConcurrentHashMap区别及工作原理前言一、HashMap、HashTable及ConcurrentHashMap的区别二、HashMap的工作原理三、相关面试题四、结构图五、尊重原创 前言 第一次写博客,水平有限可能有理解不到位或理解错的地方。欢迎各位大神参与讨论或指正。 Map在工作中的使用频率较高,HashMap相关的问题在面试中也经常被问到...

weixin_43723151的博客 1475

在 SAP ECC 中定义 ledger 时遇到 “Define exactly one leading ledger“(消息号 FAGL_LEDGER_CUST012)的错误

摘要:SAP系统要求必须且只能定义一个主导分类账(Leading Ledger)。当出现错误消息FAGL_LEDGER_CUST012时,需通过事务码FINSC_LEDGER或SPRO路径检查分类账配置,确保仅有一个分类账被标记为"LeadingLedger",其余设为"Non-leadingLedger"。主导分类账是SAP默认用于标准报表的核心分类账,修改配置需谨慎以免影响已有数据。若问题未解决,建议检查未完成配置或查阅SAP Notes获取解决方案。

金牌架构师 801

hashMap 相关面试题

HashMap 作者:TinyDolphin 链接:https://www.jianshu.com/p/75adf47958a7 来源:简书 简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。 hashmap 的主要参数都有哪些 桶容量 即数组长度:默认值16 1<<4。即在不提供有参构造器的时候,声明的桶容量 极限容量 hashmap 能承受的最大桶容量...

时光·漫步的博客 631

Muse Spark:功能、性能测试及使用方法

对于一个仅用九个月时间从零开始重建的团队来说,这样的健康状况和多模态测试结果无疑是迈出了坚实的第一步,并且经受住了独立测试的考验。Muse Spark 为每个产品确定了最重要的主题(A 产品的发布策略、B 产品的定价策略、C 产品的规模化策略),并提出了切实可行的具体行动方案。抽象视觉推理也遵循同样的模式:Muse Spark 的 ARC-AGI-2 得分为 42.5,而 GPT-5.4 和 Gemini 的得分都在 70 分左右。他的离职是由于组织结构的变化限制了他的角色,以及团队转向闭源开发。

xiaoshun007的专栏 123

SAP-RPT-1 深度解读:面向企业表格数据的 rapid one

摘要: SAP在TechEd 2025大会上推出面向企业结构化数据的SAP-RPT-1(Relational Pretrained Transformer),旨在通过in-context learning直接预测表格数据中的缺失值,无需传统机器学习流程。与LLM不同,RPT专为业务表格设计,支持实时预测(如交货延迟、回款风险等)。提供Small(高吞吐)、Large(高精度)和开源版本,用户可通过无代码Playground(上传CSV并用[PREDICT]标记目标列)或Python API快速验证。典型场景

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 234

【Java】HashMap原理及相关面试题

HashMap与Hashtable两个类都是通过Key-Value对存储的数据结构。 根据官方的说法,二者唯二的区别是HashMap线程不安全而Hashtable线程安全,并且HashMap允许null值而Hashtable不允许。 Hashtable实现线程安全的方式是使用synchronized修饰方法,所以二者基本一致。由于Hashtable效率较低,所以Java官方不建议使用这个类了;单线程的情况下使用HashMap,多线程的时候使用ConcurrentHashMap。 一、数据结构 1. 结构 H

LittleFogCat的专栏 我的个人网站:https://xiaoniu.tech 1741

基于FPGA的时间数字转换(TDC)设计(五:基于Carry4的高精度TDC设计)

基于FPGA的时间数字转换(TDC)设计,此为第五篇:基于Carry4的高精度TDC设计。提供工程文件及MATLAB测试分析代码

sdau2005的博客 8800

HashMap相关面试题(哈希表、HashMap的实现原理、HashMap的put方法的具体流程、HashMap的扩容机制、HashMap的寻址算法)

HashMap相关面试题(哈希表、HashMap的实现原理、HashMap的put方法的具体流程、HashMap的扩容机制、HashMap的寻址算法)

聂可以的博客 2242

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

HashMap的相关面试题

HashMap的相关面试题JDK8中HashMap为什么到8转为红黑树 到6转为链表?HashMap的初始大小为什么是16?加载因子为什么是0.75?扩容倍数为什么是2? JDK8中HashMap为什么到8转为红黑树 到6转为链表? TreeNode(红黑树中)占用空间是普通Node(链表中)的两倍,为了时间和空间的权衡。 如果是7,那么在极端情况下比如在同一个哈希桶中,对长度为8的哈希桶进行频繁的删除和插入,会频繁的 树化<=>非树化。 HashMap的初始大小为什么是16?加载因子为什么是0

m0_46857231的博客 593

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

java HashMap相关面试题

3.相关面试题 1.哈希表底层采用何种算法计算hash值?还有哪些算法可以计算出hash值? 底层采用的key值的hashCode()方法的值结合数组长度进行无符号右移16位(>>>)、按位异或(^)、按位与(&)计算出索引效率快 还可以采用:平方的取中法,取余数,伪随机数法,这些方法效率较慢 2.当两个对象的hashCode相等会怎么样? 会产生哈希碰撞,若key值内容相同则替换旧的value值,如果不相等,在java8之后在链表中使用链头法存储数据,如果链表的节点阈值超过八个,

菜鸟心声:学的不仅是技术,更是梦想! 400

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

[面试题] HashMap相关

目录 转载自:http://www.importnew.com/31278.html HashMap 是不是有序的? 答不是有序的。 有没有有序的Map实现类? TreeMap 和 LinkedHashMap。 TreeMap 和 LinkedHashMap 是如何保证它的顺序的? 1.TreeMap 是通过实现 SortMap 接口,...

dengju0977的博客 219

HashMap 相关面试题及其解答

Q:HashMap 的数据结构? A:哈希表结构(链表散列:数组+链表)实现,结合数组和链表的优点。当链表长度超过 8 时,链表转换为红黑树。 transient Node Q:HashMap 的工作原理? A:HashMap 底层是 hash 数组和单向链表实现,数组中的每个元素都是链表,由 Node 内部类(实现 Map.Entry> hashCode 是定位的,

TinyDolphin的博客 4136
上一篇: java程序运行结果
下一篇: mysql由浅到深
oleg829
博客等级 码龄5年 70粉丝 27原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值