《面试专题-----经典高频面试题收集二》解锁 Java 面试的关键:深度解析常见Map高频经典面试题(第二篇)

经典面试题收集二

    • 第四章(Map)
      • 1. 用过哪些Map实现
      • 2.说一下HashMap和HashTable的区别
      • 3. 介绍一下hashCode()和equals()的使用场景
      • 4. HashMap和TreeMap应该怎么选择,使用场景?
      • 5. Set和Map的关系
      • 6. 常见的Map排序规则是怎样的?
      • 7. 如果需要线程安全且效率高的Map,应该怎么做?
      • 8. 看过HashMap源码吗,介绍一下你了解的HashMap
      • 9. 能否解释下什么是Hash碰撞?常见的解决办法有哪些,hashmap采样哪种方法?
      • 10. 为什么要使用数组+链表+红黑树这几种数据结构?
      • 11. 为什么选择红黑树而不用其它树,为什么一开始不用红黑树,而是到8长度后转成红黑树
      • 12. 说下hashmap的put和get的核心逻辑
      • 13. 了解ConcurrentHashMap吗?为什么性能比hashtable高,说下原理
      • 14. jdk1.7和1.8里面ConcurrentHashMap实现的区别有了解吗

第四章(Map)

1. 用过哪些Map实现

HashMap、LinkedHashMap、ConcurrentHashMap

2.说一下HashMap和HashTable的区别

//HashMap:底层基于数组+链表,非线程安全,默认容量是16,允许有空的键和值
//Hashtable:基于哈希表实现,线程安全(加了synchronized),默认容量是11,不允许有null的键和值

3. 介绍一下hashCode()和equals()的使用场景

//hashcode:顶级类Object⾥⾯的⽅法,所有的类都是继承Object,返回是⼀个int类型的数,根据⼀定的hash规则(存储地址,字段,⻓度等),映射成⼀个数组,即散列值//equals:顶级类Object⾥⾯的⽅法,所有的类都是继承Object,返回是⼀个boolean类型,根据⾃定义的匹配规则,⽤于匹配两个对象是否⼀样
//⼀般逻辑如下:  
//判断地址是否⼀样,⾮空判断和Class类型判断  
//强转  
//对象⾥⾯的字段⼀⼀匹配 //使⽤场景:对象⽐较、或者集合容器⾥⾯查重、⽐较、排序

4. HashMap和TreeMap应该怎么选择,使用场景?

//HashMap:散列桶(数组+链表),可以实现快速的存储和检索,但是里面的元素是无序的,适合在map中插入、删除和定位//TreeMap:存储结构是一个平衡二叉树-红黑树,可以自定义排序规则,要实现Comparator接口,能便捷的实现内部元素的各种排序,但是性能一般比HashMap差,适用于自然排序或自定义排序规则

5. Set和Map的关系

//核⼼就是不保存重复的元素,存储⼀组唯⼀的对象 
//set的每⼀种实现都是对应Map⾥⾯的⼀种封装
//HashSet对应的就是HashMap,treeSet对应的就是treeMap

6. 常见的Map排序规则是怎样的?

//按照添加顺序使⽤LinkedHashMap
//按照⾃然排序使⽤TreeMap
//⾃定义排序TreeMap(Comparetor c)

7. 如果需要线程安全且效率高的Map,应该怎么做?

//多线程环境下可以使用concurrent包下的ConcurrentHashMap,或者使用Collections.synchronizedMap()

8. 看过HashMap源码吗,介绍一下你了解的HashMap

//HashMap底层(数组+链表+红⿊树 jdk8才有红⿊树)
//数组中每⼀项是⼀个链表,即数组和链表的结合体
//Node[] table 是数组,数组的元素是Entry(Node继承Entry),Entry元素是⼀个 key-value的键值对,它持有⼀个指向下个Entry的引⽤,table数组的每个Entry元素同时也作为当前Entry链表的⾸节点,也指向了该链表的下个Entry元素。在JDK1.8中,链表的⻓度⼤于8,链表会转换成红⿊树

9. 能否解释下什么是Hash碰撞?常见的解决办法有哪些,hashmap采样哪种方法?

//hash碰撞的意思是不同key计算得到的Hash值相同,需要放到同个bucket中
//常⻅的解决办法:链表法、开发地址法、再哈希法等
//HashMap采⽤的是链表法

10. 为什么要使用数组+链表+红黑树这几种数据结构?

//数组Node[] table,根据对象的key的hash值决定在数组⾥⾯是哪个节点
//链表的作⽤是解决hash冲突
//红⿊树,JDK8使⽤红⿊树来替代超过8个节点的链表,主要是查询性能的提升,从原来的O(n)O(logn), 通过hash碰撞,让HashMap不断产⽣碰撞,那么相同的key的位置的链表就会不断增⻓,当对这个Hashmap的相应位置进⾏查询的时候,就会循环遍历这个超级⼤的链表,性能就会下降,所以改⽤红⿊树

11. 为什么选择红黑树而不用其它树,为什么一开始不用红黑树,而是到8长度后转成红黑树

//⼆叉查找树在特殊情况下也会变成⼀条线性结构,和原先的链表存在⼀样的深度遍历问题,查找性能就会慢,使⽤红⿊树主要是提升查找数据的速度
//红⿊树是平衡⼆叉树的⼀种,插⼊新数据后会通过左旋,右旋、变⾊等操作来保持平衡,解决单链表查询深度的问题
//数据量少的时候操作数据,遍历线性表⽐红⿊树所消耗的资源少,且前期数据少,平衡⼆叉树保持平衡是需要消耗资源的,所以前期采⽤线性表,等到⼀定数之后变换到红⿊树

12. 说下hashmap的put和get的核心逻辑

put方法:
当你调用put(key, value)时,HashMap首先会根据key的hashCode计算出一个哈希值。
然后,通过哈希值和HashMap的容量找到对应的桶(数组位置)。
如果该桶为空,直接将键值对放入桶中;如果不为空,可能发生哈希冲突(不同的key有相同的哈希值),这时通常会使用链表或红黑树等数据结构来存储冲突的键值对。
如果链表长度过长(达到8个),会将链表转换为红黑树,以提高查询效率。get方法:
当你调用get(key)时,HashMap会根据key的hashCode计算出哈希值,并找到对应的桶。
如果桶为空,说明没有找到对应的键值对,返回null。
如果桶不为空,可能存在哈希冲突,HashMap会遍历桶内的链表或红黑树,找到匹配的key。
返回找到的value。
总体来说,HashMap的put和get操作都依赖于哈希值的计算和桶的管理。哈希表的设计使得在理想情况下,put和get的时间复杂度是常数级别的,即O(1)。不过,在发生哈希冲突时,需要通过链表或红黑树来处理,这可能会引入一些额外的复杂性。

13. 了解ConcurrentHashMap吗?为什么性能比hashtable高,说下原理

ConcurrentHashMap线程安全的Map, hashtable类基本上所有的⽅法都是采⽤synchronized 进⾏线程安全控制 ⾼并发情况下效率就降低 
ConcurrentHashMap是采⽤了分段锁的思想提⾼性能,锁粒度更细化

14. jdk1.7和1.8里面ConcurrentHashMap实现的区别有了解吗

JDK8之前,ConcurrentHashMap使⽤锁分段技术,将数据分成⼀段段存储,每个数据段配置⼀把锁,即segment类,这个类继承ReentrantLock来保证线程安全 
技术点:Segment+HashEntry JKD8的版本取消Segment这个分段锁数据结构,底层也是使⽤Node数组+链表+红⿊树,从⽽实现对每⼀段数据就进⾏加锁,也减少了并发冲突的概率,CAS()+Synchronized() 
技术点:Node+Cas+Synchronized

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/241775.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

仅操作一台设备,如何实现本地访问另一个相同网段的私网?

正文共:1034 字 8 图,预估阅读时间:4 分钟 书接上文(地址重叠时,用户如何通过NAT访问对端IP网络?),我们已经通过两台设备的组合配置实现了通过IP地址进行访问。但一般场景中&#xf…

爬虫工作量由小到大的思维转变---<第二十三章 Scrapy开始很快,越来越慢(医病篇)>

诊断篇https://blog.csdn.net/m0_56758840/article/details/135170994?ops_request_misc%257B%2522request%255Fid%2522%253A%2522170333243316800180644102%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id1703332433168001806441…

C/C++ 连接访问 MySQL数据库

前面我们已经讲述了MySQL的基础使用,现在我们来看一下如何使用语言来操作数据库。在实际开发中,语言连接MySQL是为了能够在编程语言中与MySQL数据库进行交互和操作。大部分情况我们都是通过语言连接MySQL,建立与MySQL数据库的连接&#xff0c…

原型模式(Prototype)

原型模式(Prototype Pattern)是一种创建型设计模式,允许对象在创建时通过复制一个已存在的对象(原型)来创建新对象,而不是通过传统的方式来创建。这个模式特别适用于创建复杂对象的情况,特别是当对象的创建过程比较昂贵或复杂时。 Java中实现原型模式通常涉及以下几个步…

【SassVue】仿网易云播放器动画

简介 仿网易云播放动画 效果图&#xff08;效果图&#xff09; 最终成品效果 动画组件 src/components/musicPlay.vue <template><div class"music-play"><div></div><div></div><div></div></div> </te…

【C#与Redis】--目录

1. 介绍 2. Redis 数据结构 3. Redis 命令 3.1 基本命令 3.2 字符串命令 3.3 哈希命令 3.4 列表命令 3.5 集合命令 3.6 有序集合命令 4. C# 操作 Redis 4.1 使用 Redis 库 4.2 连接 Redis 服务器 4.3 操作 Redis 数据结构 4.5 执行 Redis 命令 5. 高级主题 5.1 Redis 事…

CSS3多列

CSS3 的多列布局&#xff08;Multicolumn Layout&#xff09;允许你将文本分成多个列&#xff0c;使页面看起来更加美观。 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" cont…

INFINI Gateway 如何防止大跨度查询

背景 业务每天生成一个日期后缀的索引&#xff0c;写入当日数据。 业务查询有时会查询好多天的数据&#xff0c;导致负载告警。 现在想对查询进行限制–只允许查询一天的数据&#xff08;不限定是哪天&#xff09;&#xff0c;如果想查询多天的数据就走申请。 技术分析 在每…

CogAgent:带 Agent 能力的视觉模型来了

之前我们分享过智谱AI新一代多模态大模型 CogVLM&#xff0c;该模型在不牺牲任何 NLP 任务性能的情况下&#xff0c;实现视觉语言特征的深度融合&#xff0c;其中 CogVLM-17B 在 14 个多模态数据集上取得最好或者第二名的成绩。 12月15日&#xff0c;基于 CogVLM&#xff0c;提…

Qt使用函数指针处理信号和槽函数重载

Qt使用函数指针处理信号和槽函数重载 1. 定义函数指针 void(Teacher::* teacherSignal)(QString) &Teacher::hungry; void(Student::* studentSlot)(QString) &Student::treat;这里定义了两个函数指针&#xff1a;teacherSignal 和 studentSlot。 teacherSignal 是…

AI 绘画StableDiffusionWebui图生图

介绍 stable-diffusion-webui AI绘画工具&#xff0c;本文介绍图生图&#xff0c;以一张图片做底图优化生成。 例如&#xff1a;上传一张真人照片&#xff0c;让AI把他改绘成动漫人物&#xff1b;上传画作线稿&#xff0c;让AI自动上色&#xff1b;上传一张黑白照&#xff0c…

并发踩坑:list共享变量的addAll

背景&#xff1a; 某业务报错了&#xff0c;提示&#xff1a;Caused by: org.apache.ibatis.exceptions.PersistenceException: ### Error querying database. Cause: java.util.ConcurrentModificationException 分析&#xff1a; 这是执行查询时报的 并发修改异常。大概逻辑…

BigQuery Clustered Table 简介 - 聚簇表

Clustered Table的定义 聚簇可以提高某些类型的查询&#xff08;例如&#xff0c;使用过滤条件子句的查询和聚合数据的查询&#xff09;的性能。当通过查询作业或加载作业将数据写入聚簇表时&#xff0c;BigQuery 会使用聚簇列中的值对这些数据进行排序。这些值用于将数据整理…

Springboot2.6以下版本对cookie的samesite设置的通用方法

通过安全扫描工具对spring技术栈开发的应用进行漏洞检查时&#xff0c;通常会扫描出关于cookie相关的漏洞&#xff0c;其中一个是: Cookie without SameSite attribute&#xff0c;对于其描述通常如下: When cookies lack the SameSite attribute, Web browsers may apply di…

web3风险投资公司之Electric Capital

文章目录 什么是 Electric CapitalElectric团队 Electric Capital 开发者报告参考 什么是 Electric Capital 官网&#xff1a;https://www.electriccapital.com/ 官方github&#xff1a;https://github.com/electric-capital Electric Capital 是一家投资于加密货币、区块链企…

【Qt】qDebug() 输出16进制数的几种方法

Qt qDebug() 输出16进制数字的几种方法整理&#xff1a; 1. 代码 qDebug() << Qt::hex << Qt::showbase << 5;qDebug() << QString::number(5, 16);qDebug() << (void *) 5;qDebug() << QString("%1").arg(5, 0, 16);qDebug() …

编译安装PHP5.6

PHP&#xff1a;安装PHP5.6 yum install libxml2 libxml2-devel openssl openssl-devel bzip2 bzip2-devel libcurl libcurl-devel libjpeg libjpeg-devel libpng libpng-devel freetype freetype-devel gmp gmp-devel libmcrypt libmcrypt-devel readline readline-devel lib…

【VB测绘程序设计】案例11—坐标正算的计算案例(附源码)

【VB测绘程序设计】案例11—坐标正算的计算案例(附源码) 文章目录 前言一、界面预览二、程序介绍三、程序源代码总结前言 ` VB程序在测绘领域应用广泛,能够解决一些常见的简单的计算问题,提高工作效率,本专栏持续更新常用的测绘计算,感谢关注。 坐标正算是已知边长和方位…

【Linux】进程管理

ps&#xff1a;报告当前进程快照。top&#xff1a;显示任务。kill&#xff1a;给一个进程发送信号。shutdown&#xff1a;关机或重启系统。 一个程序可以发动另一个程序被表述为一个父进程可以产生一个子进程&#xff0c;内核维护每个进程的信息&#xff0c;以此来保持事情有序…

git拉取远程分支到本地

场景一&#xff1a; 需要与远程分支建立映射关系 通常用于在另一台电脑上要使用自己的分支 git checkout -b 本地分支名xxx origin/远程分支名xxx这种方式会在本地仓库新建分支xxx&#xff0c;并自动切换到新建的分支xxx&#xff0c;远程分支xxx的代码也拉去到了本地分支xxx中。…