面试官问我Map接口,我

Map面试题 Map面试题,Java,哈希算法 阅读详情

面试官:今天来讲讲Map吧,你对Map了解多少?就讲JDK 1.8就好咯

候选者:Map在Java里边是一个接口,常见的实现类有HashMap、LinkedHashMap、TreeMap和ConcurrentHashMap

候选者:在Java里边,哈希表的结构是数组+链表的方式。

候选者:HashMap底层数据结构是数组+链表/红黑树

候选者:LinkedHashMap底层数据结构是数组+链表/红黑树+双向链表

候选者:TreeMap底层数据结构是红黑树

候选者:而ConcurrentHashMap底层数据结构也是数组+链表/红黑树

面试官:我们先以HashMap开始吧,你能讲讲当你new一个HashMap的时候,会发生什么吗?

候选者:HashMap有几个构造方法,但最主要的就是指定初始值大小和负载因子的大小。

候选者:如果我们不指定,默认HashMap的大小为16,负载因子的大小为0.75

候选者:HashMap的大小只能是2次幂的,假设你传一个10进去,实际上最终HashMap的大小是16,你传一个7进去,HashMap最终的大小是8,具体的实现在tableSizeFor可以看到。

候选者:我们把元素放进HashMap的时候,需要算出这个元素所在的位置(hash)。

候选者:在HashMap里用的是位运算来代替取模,能够更加高效地算出该元素所在的位置。

候选者:为什么HashMap的大小只能是2次幂,因为只有大小为2次幂时,才能合理用位运算替代取模。

候选者:而负载因子的大小决定着哈希表的扩容和哈希冲突。

候选者:比如现在我默认的HashMap大小为16,负载因子为0.75,这意味着数组最多只能放12个元素,一旦超过12个元素,则哈希表需要扩容。

候选者:怎么算出是12呢?很简单,就是16*0.75。每次put元素进去的时候,都会检查HashMap的大小有没有超过这个阈值,如果有,则需要扩容。

候选者:鉴于上面的说法(HashMap的大小只能是2次幂),所以扩容的时候时候默认是扩原来的2倍

候选者:扩容这个操作肯定是耗时的,那能不能把负载因子调高一点,比如我要调至为1,那我的HashMap就等到16个元素的时候才扩容呢。

候选者:是可以的,但是不推荐。负载因子调高了,这意味着哈希冲突的概率会增高,哈希冲突概率增高,同样会耗时(因为查找的速度变慢了)

面试官:那我想问下,在put元素的时候,传递的Key是怎么算哈希值的?

候选者:实现就在hash方法上,可以发现的是,它是先算出正常的哈希值,然后与高16位做异或运算,产生最终的哈希值。

候选者:这样做的好处可以增加了随机性,减少了碰撞冲突的可能性。

面试官:了解,你简单再说下put和get方法的实现吧

候选者:在put的时候,首先对key做hash运算,计算出该key所在的index。

候选者:如果没碰撞,直接放到数组中,如果碰撞了,需要判断目前数据结构是链表还是红黑树,根据不同的情况来进行插入。

候选者:假设key是相同的,则替换到原来的值。最后判断哈希表是否满了(当前哈希表大小*负载因子),如果满了,则扩容

候选者:在get的时候,还是对key做hash运算,计算出该key所在的index,然后判断是否有hash冲突

候选者:假设没有冲突直接返回,假设有冲突则判断当前数据结构是链表还是红黑树,分别从不同的数据结构中取出。

面试官:那在HashMap中是怎么判断一个元素是否相同的呢?

候选者:首先会比较hash值,随后会用==运算符和equals()来判断该元素是否相同。

候选者:说白了就是:如果只有hash值相同,那说明该元素哈希冲突了,如果hash值和equals() || == 都相同,那说明该元素是同一个。

面试官:你说HashMap的数据结构是数组+链表/红黑树,那什么情况拿下才会用到红黑树呢?

候选者:当数组的大小大于64且链表的大小大于8的时候才会将链表改为红黑树,当红黑树大小为6时,会退化为链表。

候选者:这里转红黑树退化为链表的操作主要出于查询和插入时对性能的考量。

候选者:链表查询时间复杂度O(N),插入时间复杂度O(1),红黑树查询和插入时间复杂度O(logN)

面试官:你在日常开始中LinkedHashMap用的多吗?

候选者:其实在日常开发中LinkedHashMap用得不多。

候选者:在前面也提到了,LinkedHashMap底层结构是数组+链表+双向链表,实际上它继承了HashMap,在HashMap的基础上维护了一个双向链表。

候选者:有了这个双向链表,我们的插入可以是有序的,这里的有序不是指大小有序,而是插入有序。

候选者:LinkedHashMap在遍历的时候实际用的是双向链表来遍历的,所以LinkedHashMap的大小不会影响到遍历的性能

面试官:那TreeMap呢?

候选者:TreeMap在现实开发中用得也不多,TreeMap的底层数据结构是红黑树

候选者:TreeMap的key不能为null(如果为null,那还怎么排序呢),TreeMap有序是通过Comparator来进行比较的,如果comparator为null,那么就使用自然顺序

面试官:再来讲讲线程安全的Map吧?HashMap是线程安全的吗?

候选者:HashMap不是线程安全的,在多线程环境下,HashMap有可能会有数据丢失和获取不了最新数据的问题,比如说:线程Aput进去了,线程Bget不出来。

候选者:我们想要线程安全,可以使用ConcurrentHashMap

候选者:ConcurrentHashMap是线程安全的Map实现类,它在juc包下的。

候选者:线程安全的Map实现类除了ConcurrentHashMap还有一个叫做Hashtable。

候选者:当然了,也可以使用Collections来包装出一个线程安全的Map。

候选者:但无论是Hashtable还是Collections包装出来的都比较低效(因为是直接在外层套synchronize),所以我们一般有线程安全问题考量的,都使用ConcurrentHashMap

候选者:ConcurrentHashMap的底层数据结构是数组+链表/红黑树,它能支持高并发的访问和更新,是线程安全的。

候选者:ConcurrentHashMap通过在部分加锁和利用CAS算法来实现同步,在get的时候没有加锁,Node都用了volatile给修饰。

候选者:在扩容时,会给每个线程分配对应的区间,并且为了防止putVal导致数据不一致,会给线程的所负责的区间加锁

面试官:你能给我讲讲JDK 7 和JDK8中HashMap和ConcurrentHashMap的区别吗?

候选者:不能,我不会

候选者:我在学习的时候也看过JDK7的HashMap和ConcurrentHashMap,其实还是有很多不一样的地方

候选者 比如JDK 7 的HashMap在扩容时是头插法,在JDK8就变成了尾插法,在JDK7 的HashMap还没有引入红黑树….

候选者:ConcurrentHashMap 在JDK7 还是使用分段锁的方式来实现,而JDK 8 就又不一样了。但JDK 7细节我大多数都忘了。

候选者:我就没用过JDK 7的API,我想着现在最低应该也是用JDK8了吧?所以我就没去仔细看了。

面试官:你这很危险!

【对线面试官-移动端】系列 一周两篇持续更新中!

【对线面试官-电脑端】系列 一周两篇持续更新中!

原创不易!!求三连!!

AI面试 | 被AI面试官问到对Java Map接口 回答完毕后,我稍作停顿,等待 AI 面试官的反馈。此外,我还补充道,我们也可以利用 Collections.synchronizedMap 方法将 HashMap 包装成线程安全的 Map,只是这种方式在性能上稍逊于 ConcurrentHashMap,因为它是对整个 Map 加锁,在高并发时容易引发竞争加剧的问题。AI 面试官指出我的回答亮点在于清晰地阐述了 Map 接口存储键值对的特性以及键值的重复规则,并且准确无误地列举了三个常用实现类,还分别说明了它们的底层数据结构、性能特点和线程安全性。 阅读详情

相关推荐

面试官问我 Spring 怎么注入集合,我拿出了这份全攻略!

如何注入 List、Set、Map;XML 与注解配置的区别;自动装配多个实现到集合;使用 @Value 从配置文件注入集合;面试中的“加分项”与应对策略。这正是面试中常见的“递进式问题”:你以为它只是一个集合,其实它考察的是你对 Spring IoC 容器、Bean 注入方式、组件管理能力的理解。

孤芳不自赏 722

Map相关的高频面试题详细分析讲解_层层深入_由浅入深_面试Map相关的掌握这些足够了

Map相关的高频面试题详细分析讲解_层层深入_由浅入深_面试Map相关的掌握这些足够了

C_x_330的博客 1011

如果你是一个Golang面试官,你会问哪些问题?

小编这两天本来想在公司发个面经,于是偶然搜到了这篇 如果你是一个Golang面试官,你会问哪些问题?[1],文章下面也有很多大佬的优秀回答,感兴趣的同学可以查看原文了解更多内容。下面小土主要收集了两个回答。另外小编在语雀也搜集了不少Gopher面经,没有假如,我就是一个Golang面试官,来自百度。同时我到百度之前也面过头条,腾讯,小米,高德的golang,基本都过了。我回答应该还是比较有说服力。事实上,golang的问题只占我面试问题的20%左右。问东西的顺序不一定是下面的顺序,有的时候我会根据简历选择二

m0_68850571的博客 707

Map经典面试题

Map Map集合的特点: public interface Map<K,V> 1.Map集合是一个双列集合,一个元素包含两个值(一个key,yige value) 2.Map集合中的元素,key和value的数据类型可以相同,也可以不相同 3.Map集合中的元素,key是不允许重复的,value是可以重复的 4.Map集合中的元素,key和value是一一对应 put() publi...

kbh528202的博客 6425

【上海大学计算机组成原理实验报告】七、程序转移机制

学习实现程序转移的硬件机制//掌握堆栈寄存器的使用//手动方式实现子程序调用转移过程//手动方式实现子程序返回转移过程//编程实现`OUT`寄存器交替显示`11`和`55`//若要求`11`和`55`各显示`50`次后停机,应该如何修改程序?//根据实验指导书的相关内容,实验箱系统的程序转移硬件机制在于,当`LDPC`有效时,如果此时`DUBS`上的值就是转移的目标地址,则此目标地址被打入`PC`,从而实现程序的转移;若`LDPC`为`0`是附带条件的,就形成“条件转移”。

HackerKevon的博客 2471

零代码做游戏:AI辅助开发HTML5网页小游戏从创意到发布全流程

在软件开发领域,自然语言编程正成为一种新兴的人机协作方式,而AI辅助开发则是其最典型的落地形态。它让开发者无需精通语法,只需用清晰的语言描述游戏规则与交互逻辑,AI便能自动生成可运行的代码。这种模式大幅降低了编程门槛,尤其适合快速验证创意、制作原型。对于HTML5网页游戏而言,借助AI生成单个HTML文件,配合在线运行环境,即可在浏览器中直接试玩、迭代与分享。无论是产品经理验证玩法、运营人员制作互动小游戏,还是教育者设计课堂闯关,都能通过自然语言描述需求,让AI完成代码实现与报错修复。本文完整记录了一个“接

weixin_31497453的博客 328

Map集合常见面试题

在java面试过程中,Map时常会被作为一个面试点来问,今天就在这里整理总结一下 首先回顾一下集合体系集合面试过程中,对于单列集合经常会被问到List和set的区别 list集合元素有序并且集合元素可以重复 set集合元素无序并且集合元素不允许重复 集合面试过程中,对于单列集合经常会被问道Arraylist和Linkedlist的区别 Arraylist底层数据结构为数组...

weixin_42362271的博客 1万+

把群晖NAS变成游戏开发服务器:Perforce与虚幻引擎深度整合的5个关键配置(含.p4ignore模板)

本文详细介绍了如何将群晖NAS配置为游戏开发服务器,重点讲解了Perforce与虚幻引擎的深度整合。通过五个关键配置节点,包括用户权限架构、Workspace策略、资产同步优化、仓库清洁度保障和编辑器深度集成,帮助小型团队打造高效开发环境。文章还提供了实用的.p4ignore模板和优化技巧,显著提升开发效率。

weixin_30430677的博客 317

Map相关面试答案(都是简单版

1、继承2、红黑树实现,返回有序的key3、在创建时需要提供comparator来排序。

weixin_43675252的博客 558

U-net复现pytorch版本 以及制作自己的数据集并训练

GitHub链接: https://github.com/milesial/Pytorch-UNet 论文链接:

candice5566的博客 3万+

adams案例分析_案例1(麦弗逊悬架子系统创建)

本文字数3292字83图,建议阅读时间26分钟首先看下案例1的麦弗逊悬架数模结构就不细讲了,从数模上主要是获取硬点坐标(铰接点、安装点、参考点)及大部件结构(副车架、摆臂、转向节等实际运动过程中会产生变形的部件,在ADAMS Car中我们就可以用柔性体来搭建)再来回顾下上一篇讲到的模型元素1、Hardpoint——硬点(只有位置没有方向)2、Parameter Variable——参数...

weixin_39609407的博客 6475

面试官问JavaScript的forEach、map、filter的区别了解吗

最近面了字节,这个问题直接把我问的怀疑人生。所以简单总结下,以备日后。 面试官问:js的数组有几个方法,forEach、map、filter,它们有什区别? 我:刚开始回答说map和filter必须要有返回值,forEach可以没有。 面试官问:那如果我一定要在forEach中return什么呢,会怎么样? 我:(直接虚了)磕磕巴巴的说,应该不会怎么样吧[~泪崩]。 面试官笑了问:行,那我换个问法,你能说一下下面arr和newArr执行后的值吗? let arr = [1, 4, 6, 2]; let ne

楚楚梦厦的博客 567

可信数据空间:可信空间、区域功能节点、业务功能节点、连接器的关联关系

可信数据空间通过分层架构实现安全数据共享:可信空间作为顶层制定全局规则;区域功能节点协调辖区内功能节点协作;功能节点提供具体数据服务;连接器作为唯一通信通道确保安全交互。系统采用"规则自上而下约束,数据自下而上流动"机制,通过分层治理和标准化连接,在保证数据主权的同时实现跨域协作,具有策略分级执行、去中心化治理等特性,支持灵活扩展业务场景。

友莘居士的博客 1685

AI面试 | 被AI面试官问到对 Java Map的理解

面试开始,AI 面试官抛出了第一个问题:“在 Java 中,Map 接口有哪些常用的实现类,它们的特点分别是什么,并且如何使用它们来存储和获取键值对?对于第一个问题,给了我 80 分,亮点是准确列举了常用实现类,清晰阐述特点及操作方法。但不足的是,没有阐述 ConcurrentHashMap 性能优势的原因,也未提及使用线程安全 Map 的性能损耗考量。今天,我尝试使用了一款 AI 面试官,进行了一次模拟面试,没想到这次经历让我对 Java MAP的使用的理解这个重要知识点有了全新且深刻的认识。

chenhuan151515的专栏 484

Dify智能体开发:发布嵌入网站

Dify 支持将你的 AI 应用嵌入到业务网站中,你可以使用该能力在几分钟内制作具有业务数据的官网 AI 客服、业务知识问答等应用。点击 WebApp 卡片上的嵌入按钮,复制嵌入代码,粘贴到你网站的目标位置。

王国平的博客 3243

android 蓝牙通讯demo

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

面试官问:forEach() 和 map() 的区别

今天我们来看一下 Array中 Array.forEach()和 Array.map()方法之间的区别。forEach()和map()方法通常用于遍历Array元素,但几乎没有区别,我们来...

我本可以容忍阳光,如果我不曾见过太阳,然而阳光已使我荒凉,成为更新的荒凉。 4416

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

都说ThreadLocal被面试官问烂了,可为什么面试官还是喜欢继续问

面试官:有如下场景:在多线程并发情况下,有一个共享变量,不同线程设置不同值后,各线程只想获取自己设置的值,如何实现?小小白:使用ThreadLocal,...

JavaQ 1万+

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Unity法线贴图

一、凹凸贴图 凹凸贴图主要用于增强表现细节,核心在于法线,因为光照模型中法线是影响物体表面细节的重要因素,而法线贴图就是一种非常常见和重要的凹凸贴图。 二、法线贴图 法线贴图其实就是将物体的法线信息存入到贴图中,一个像素点的4个分量可以分别代表不同的信息,当它的xyz都用来存储物体的法线信息的时候这就是一张法线贴图,如果存储的是别的属性信息,那它就是别的图。 切线空间的法线:x轴代表该点的...

mozhi 2253

GO 面试题基础篇【面试官这样问】

这不,最近又是金三银四了, gopher 们又双叒叕开启了开挂模式,疯狂刷面试题,疯狂投简历,疯狂面试。 既然如此,针对于go语言,那面试官们平时喜欢问什么呢?面试官这样问。

qq_19283249的博客 2649

面试官问我:“为什么不用 Java 的 Map 缓存 JSON,而用 Redis Hash?”

【摘要】本文探讨Java Map与Redis Hash在缓存中的适用场景差异。Java Map作为本地缓存,存在单机局限、无法共享数据、缺乏持久化和内存管理等问题;而Redis Hash作为分布式缓存,支持跨服务共享、字段级操作、TTL过期策略和数据持久化,更适合缓存结构化JSON数据。通过对比两者的存储本质、数据持久化、内存管理和局部更新能力,得出结论:业务场景决定技术选型,Redis Hash更适合分布式系统中的结构化数据缓存。技术决策应基于实际需求,而非单纯追求性能。

m0_74023628的博客 868

被面试官嘲讽 面试官说map的底层是set

被面试官嘲讽 面试官说map的底层是set

kunisbig的博客 505

面试官问:Stream 中的 map、peek、foreach 方法的区别?傻傻分不清楚。。

背景 之前栈长在公众号Java技术栈分享了这篇文章: 别再写一堆的 for 循环了!Java 8 中的 Stream 轻松遍历树形结构,是真的牛逼! 原代码是这样的: List<Menu> children = all.stream().filter(...).map( (m) -> { m.setChildList(getChildrens(m, all)); return m; } ).collect(Collectors.toLis

Java技术栈,分享最主流的Java技术 3049

阿里的面试官都喜欢问哪些问题?

作者:徐刘根 | 公众号:Java之间 金九银十是招聘的旺季,小编在这里也给大家整理了一套阿里面试官最喜欢问的问题或者出场率较高的面试题,助校招或者社招路上的你一臂之力! 首先我们需要明白一个事实,招聘的一个很关键的因素是在给自己找未来的同事,同级别下要找比自己优秀的人,面试是一个双向选择的过程,也是一个将心比心去沟通的过程。 就像我们有的人感觉自己很牛逼,但是拿不到offer,...

徐刘根的博客 1万+

面试官问我“Map、List、Set 有什么区别”,我举了三个比喻直接秒杀

特性ListSetMap顺序✅部分部分重复元素✅❌用途有序集合唯一集合键值对映射线程安全❌(可用同步包装)❌❌(ConcurrentMap 可)常见实现ArrayListHashSetHashMapJava 集合不是记忆题,而是逻辑题,背不如懂,懂了就会用。关注「小奇 Java 面试」,我不仅能把集合讲成段子,还能把段子变成 offer。

真正的大师永远怀着一颗学徒的心 406
上一篇: 面试官问我List接口,我
下一篇: 面试官:今天聊聊Redis持久化机制吧?
Java3y
Java3y 领域专家: 后端开发技术领域 领域专家: 后端开发技术领域
博客等级 码龄9年 1万+粉丝 509原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值