求求大厂给个Offer:Map面试题

三歪教你学Java集合(1).pdf Java集合 立即下载

前言

文本已收录至我的GitHub:https://github.com/ZhongFuCheng3y/3y,有300多篇原创文章,最近在连载面试系列!

我,三歪,最近开始写面试系列。我给这个面试系列取了一个名字,叫做《求求大厂给个Offer》

所以这篇文章叫做《求求大厂给个Offer:Map面试题》

接下来就开始吧。

面试现场

三歪:“我叫三歪,目前维护一个公众号叫做Java3y,这几年写了300+原创技术文章,近1000页的原创电子书和多个知识点的思维导图。我的愿景是:只要关注我并三连的同学都可以拿到大厂offer。我的…”

三歪:“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个元素的时候才扩容呢。显然是可以的,但是不推荐。负载因子调高了,这意味着哈希冲突的概率会增高,哈希冲突概率增高,同样会耗时(因为查找的速度变慢了)”

三歪:“实现就在hash方法上,可以发现的是,它是先算出正常的哈希值,然后与高16位做异或运算,产生最终的哈希值。这样做的好处可以增加了随机性,减少了碰撞冲突的可能性。”

三歪:”在put的时候,首先对key做hash运算,计算出该key所在的index。如果没碰撞,直接放到数组中,如果碰撞了,需要判断目前数据结构是链表还是红黑树,根据不同的情况来进行插入。假设key是相同的,则替换到原来的值。最后判断哈希表是否满了(当前哈希表大小*负载因子),如果满了,则扩容“

三歪:”在get的时候,还是对key做hash运算,计算出该key所在的index,然后判断是否有hash冲突,假设没有直接返回,假设有则判断当前数据结构是链表还是红黑树,分别从不同的数据结构中取出。“

三歪:”首先会比较hash值,随后会用==运算符和equals()来判断该元素是否相同。说白了就是:如果只有hash值相同,那说明该元素哈希冲突了,如果hash值和equals() || == 都相同,那说明该元素是同一个。“

三歪:”当数组的大小大于64且链表的大小大于8的时候才会将链表改为红黑树,当红黑树大小为6时,会退化为链表。这里转红黑树退化为链表的操作主要出于查询和插入时对性能的考量。链表查询时间复杂度O(N),插入时间复杂度O(1),红黑树查询和插入时间复杂度O(logN)“

三歪:“其实在日常开发中LinkedHashMap用得不多。在前面也提到了,LinkedHashMap底层结构是数组+链表+双向链表”,实际上它继承了HashMap,在HashMap的基础上维护了一个双向链表。有了这个双向链表,我们的插入可以是“有序”的,这里的有序不是指大小有序,而是插入有序。

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

三歪:“TreeMap在现实开发中用得也不多,TreeMap的底层数据结构是红黑树,TreeMap的key不能为null(如果为null,那还怎么排序呢),TreeMap有序是通过Comparator来进行比较的,如果comparator为null,那么就使用自然顺序”

三歪:“HashMap不是线程安全的,在多线程环境下,HashMap有可能会有数据丢失和获取不了最新数据的问题,比如说:线程Aput进去了,线程Bget不出来。我们想要线程安全,可以使用ConcurrentHashMap”

三歪:“ConcurrentHashMap是线程安全的Map实现类,它在juc包下的。线程安全的Map实现类除了ConcurrentHashMap还有一个叫做Hashtable。当然了,也可以使用Collections来包装出一个线程安全的Map。但无论是Hashtable还是Collections包装出来的都比较低效(因为是直接在外层套synchronize),所以我们一般有线程安全问题考量的,都使用ConcurrentHashMap”

三歪:“ConcurrentHashMap的底层数据结构是数组+链表/红黑树,它能支持高并发的访问和更新,是线程安全的。ConcurrentHashMap通过在部分加锁和利用CAS算法来实现同步,在get的时候没有加锁,Node都用了volatile给修饰。在扩容时,会给每个线程分配对应的区间,并且为了防止putVal导致数据不一致,会给线程的所负责的区间加锁”

三歪:“不能,我不会”

三歪:“我在学习的时候也看过JDK7的HashMap和ConcurrentHashMap,其实还是有很多不一样的地方,比如JDK 7 的HashMap在扩容时是头插法,在JDK8就变成了尾插法,在JDK7 的HashMap还没有引入红黑树…ConcurrentHashMap 在JDK7 还是使用分段锁的方式来实现,而JDK 8 就又不一样了。但JDK 7细节我大多数都忘了。”

三歪:“我就没用过JDK 7的API,我想着现在最低应该也是用JDK8了吧?所以我就没去仔细看了。要不我给你讲讲多线程相关的知识呗?”

三歪:“哦”

题外话

针对这次的面试可能你想了解更多Map的细节,比如说Map基础知识/HashMap/LinkedHashMap/TreeMap/ConcurrentHashMap的源码,可以翻一下我优快云以前的文章!

欢迎点赞,这是我更新的动力!

3y:从Java基础,JavaWeb基础到常用的框架再到面试题都有完整的教程,几乎涵盖了Java必要的知识点 已经有8756个初学者都下载了! :fire:三歪把【大厂面试知识点】,【简历模板】,【原创文章】全部整理成电子书,共有1263页! PDF文档的内容可以手动打,有任何的不懂都可以直接来问我(公众号有我的私人的联系方式)。扫一扫二维码或微信搜索Java3y ,在公众号下回复“ 888 ”即可获取!! 从Java基础,JavaWeb基础到常用的框架再到面试题都有完整的教程,几乎覆盖了Java必要的知识点。该开源仓库的文章都是我个人原创,公众号发过的技术文章(干货)也会有相关的目录整理,很多知识点我还在不停的总结和完善。点击关注及时获取最新文章 :sparkling_heart:我希望这个开源仓库: 能给你学习时带来帮助 能给你感受文章的温度 能帮助你建立知识体系 ... :dollar_banknote:对线面试官面试系列 :hot_beverage:原创电子书 下面的文章都有对应的原创精美PDF,在持续更新中,可以来找我催更〜 冬眠 AJAX ...... :hot_beverage: Java基 立即下载

相关推荐

Java3y.zip

Java3y.zip

再见了,三歪

傻瓜再见

敖丙 2万+

利用OrthoFinder做泛基因家族聚类分析

这条命令会将 Arabidopsis_thaliana.TAIR10.59_longest_trans.pep.fa 文件中的所有序列ID,去掉ID中的空格后面的部分,只保留 > 后第一个空格之前的基因ID,并将结果保存在 An1.fasta 文件中。muscle 是一种常用的多序列比对工具,用于基因组或蛋白质序列的比对。基因家族(Gene family),是来源于同一个祖先,由一个基因通过基因重复而产生两个或更多的拷贝而构成的一组基因,它们在结构和功能上具有明显的相似性,编码相似的蛋白质产物。

qq_64400864的博客 2750

java中map的put方法,斩获offer

5节创建者模式 第1节:工厂方法模式 第2节:抽象工厂模式 第3节:建造者模式 第4节:原型模式 第5节:单例模式 7节结构型模式 第1节:适配器模式 第2节:桥接模式 第3节:组合模式 第4节:装饰器模式 第5节:外观模式 第6节:享元模式 第7节:代理模式 10节行为模式 第1节:责任链模式 第2节:命令模式 第3节:迭代器模式 第4节:中介者模式 第5节:备忘录模式 第6节:观察者模式 第7节:状态模式 第8节:策略模式 第9节:模板模式 第10节:访问者模式

m0_57286472的博客 252

CE 7.4中文版实战:如何用自动汇编功能快速生成游戏修改器(附CT表保存技巧)

本文详细介绍了CE 7.4中文版中自动汇编功能的使用方法,帮助用户快速生成游戏修改器。从环境配置、内存地址定位到自动汇编代码注入,再到CT表保存和独立EXE生成,提供全流程实战指南,适合逆向工程爱好者和游戏修改器开发者。

keras9composer的博客 357

群晖Lucky套件高级玩法-——更新证书同步更新群晖自带证书

群晖Lucky套件高级玩法-——更新证书同步更新群晖自带证书

wojuzi的博客 2455

3Y面试宝典

` ???? 对线面试官面试系列 【对线面试官】简历 【对线面试官】Java注解 【对线面试官】Java泛型 【对线面试官】Java NIO 【对线面试官】Java反射 && 动态代理 【对线面试官】多线程基础 一周两篇持续更新中,文章首发公众号 ☕️ 原创电子书 下面的文章都有对应的原创精美PDF,在持续更新中,可以来找我催更~ 47页的SpringMVC 92页的Mybatis 129页的多线程 141页的Servlet 158页的JSP 76页的集合 64页的JDBC 105

weixin_49574902的博客 794

开发者体验度量:构建DevEx评估体系的方法论与工具

在深入讨论度量方法前,我们需要明确什么是开发者体验(DevEx)。许多人将其简化为"开发工具好不好用",这是一个危险的误解。开发者体验是指开发者在完成工作过程中的整体感受和效率,它由三大核心维度组成:工具与基础设施:开发、测试、部署工具链的效能流程与协作:工作流程的顺畅度和团队协作的效率文化与成长:支持实验、学习和专业发展的环境这三个维度相互作用,共同决定了开发者能否高效且愉悦地完成工作。开发者体验不是一个目的地,而是一段持续的旅程。

2401_88760782的博客 1429

剑指Offer(类库)——HashMap、HashTable、ConcurrentHashMap底层源码详解

Map是由一对对的Key-Value组成的,key要求唯一,value无所谓。 我们可以针对这点直接看源码; key自带去重功能,因为是Set类型的。 value则只是Collection接口,可以存放任意集合。 下面来看看map的一些实现类 下面,来解决一道非常重要的面试题: HashMap,HashTable,ConcurrentHashMap有什么区别? 1.HashMap 首先来介绍一...

0117 421

ZedBoard+Vivado(二)——PS + PL实现流水灯

硬件:Zedboard 软件:Vivado2018.2 + Win10 本文参考了http://blog.chinaaet.com/cuter521/p/35978的设计 1 设计 功能:PS + PL流水灯 语言:C 流程:创建工程->IP Integrator->综合、实现、生成Bitstream->SDK 2 流程 2.1 创建工程 跟上一篇步骤完全相同,这里不用添加源文...

q416524389的博客 3695

命令行执行YOLO训练命令报错:1.PermissionError: [WinError 5] 拒绝访问 2.OMP: Error#15: Initializing libiomp5md.dll...

(已解决!)报错:1.PermissionError: [WinError 5] 拒绝访问 2.OMP: Error #15: Initializing libiomp5md.dll, but found libiomp5md.dll already initialized.

Gpengyuyan的博客 1125

火影推荐程序连载-9求求大厂给个Offer:Map面试题

我,三歪,最近开始写面试系列。我给这个面试系列取了一个名字,叫做《求求大厂给个Offer》 所以这篇文章叫做《求求大厂给个Offer:Map面试题》 接下来就开始吧。 面试现场 三歪:“我叫三歪,这几年写了300+原创技术文章,近1000页的原创电子书和多个知识点的思维导图。我的愿景是:只要关注我并三连的同学都可以拿到大厂offer。我的....” 三歪:“Map在Java里边是一个接口,常见的实现类有HashMap、LinkedHashMap、TreeMap和ConcurrentHa

li123128的博客 185

DDR5内存Training全解析:从信号完整性到CS训练模式的实战指南

本文深入解析了DDR5内存Training的全过程,从信号完整性挑战到CS训练模式(CSTM)的实战应用。文章详细阐述了Training在DDR5高频时代的关键作用,对比了In-Band与OOB两种架构,并拆解了Intel MRC的核心训练步骤,为硬件与固件工程师提供了诊断与优化系统稳定性的实用指南。

weixin_29252171的博客 1031

刷了大半年Java面试题:终于拿到众多大厂offer,分享还愿

前言 今天给大家分享下我整理的Java架构面试专题及答案,其中大部分都是大企业面试常问的面试题,可以对照这查漏补缺,当然了,这里所列的肯定不可能覆盖全部方式。 很多Java开发者面试之前,可能没有较长的工作时间或者较为丰富的工作经验,所以不知道互联网公司或者一线互联网公司技术面试都会问哪些问题? 再加上可能自己准备也不充分,去面试没几个回合就被面试官几个问题打蒙了,最后以惨败收场。针对这些的读者朋友,小编整理了一些知名大厂的面经,在这分享给读者朋友们参考,让即将面试或是有想法跳槽的读者朋友们了解一下一线

dhlnb的博客 1128

山羚羊优化算法(MGO)详解:从自然智慧到优化引擎

山羚羊优化算法(MGO)是一种新型元启发式算法,灵感来源于山羚羊的社会行为和等级制度。该算法模拟了四种核心行为:领地独居雄性(局部开发)、母系山瞪羚群(群体协作)、单身雄性山瞪羚(全局探索)和迁徙觅食(动态扰动)。MGO通过数学建模将这些生物行为转化为优化机制,在探索与开发间实现平衡。算法已成功应用于函数优化、无人机路径规划和支持向量机优化等领域,展现出优异的性能。未来研究将聚焦于参数自适应调整、混合算法设计等方向,以进一步提升算法性能。

qq_42212808的博客 203

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

面试大厂必看!凭借这份Java面试题,成功拿到阿里offer!

前言 一位小伙伴经过一个半月的面试准备,成功拿下了阿里的offer,小编把他遇到的面试题分享出来,希望能对即将面试的小伙伴有所帮助。 一、自我介绍 简单的介绍一下自己的工作经历与职责,在校或者在工作中主要的工作内容,主要负责的内容; 介绍下自己最满意的,有技术亮点的项目或平台,重点介绍下自己负责那部分的技术细节; 二、Java多线程 线程池的原理,为什么要创建线程池?创建线程池的方式; 线程的生命周期,什么时候会出现僵死进程; 说说线程安全问题,什么实现线程安全,如何实现线程安全; 创建线程池有哪几个核心

weixin_47955802的博客 2186

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

全新2020大厂Java高频面试题新鲜出炉,啃完这份文档,offer岂不是手到擒来?

前言: 最近不是写了一篇关于“好基友”面试成功的干货文章吗,谢谢大家的支持反响很不错。但是好多人私信我说,里面的一些面试题不是常见遇到的,而且局限性很高,以及一些常见面试题的补充。非常感谢大家的建议,我针对大家的建议以及掏空了各大搜索引擎,终于整理了一份比较普遍的java面试题,为了感谢大家的支持,现在分享给大家,请大家多多提建议哦,大家的建议我都会看的,毕竟比我厉害的大神有很多哈哈。如果想要资料答案的话可以私信我(面试集题)自行领取 ,或者查看评论自行领取。 Java集合22题 这个算是j.

JavaJIAMIN的博客 5043

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

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

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

最全的BAT大厂面试题整理,“干完”这份300页1000道面试题,大厂Offer拿到手软

转载请标明出处: https://www.jianshu.com/p/c70989bd5f29 本文出自 AWeiLoveAndroid的博客 临近年关,又到了面试求职高峰期,最近有很多网友都在求大厂面试题。正好我之前电脑里面有这方面的整理,于是就发上来分享给大家。 这些题目是网友去百度、小米、乐视、美团、58、猎豹、360、新浪、搜狐等一线互联网公司面试被问到的题目。熟悉本文中列出的知识点会大大增加通过前两轮技术面试的几率。 网上的都是按照公司划分的,想找具体某一方面的知识点有点不好找,我这里就根据知识

Android725的博客 1561

【屌丝逆袭】记录一下一个末流985强势逆袭拿到字节offer的经历,附上我的面经!

前言 这次真的是怀着超级激动地心情写下这篇文章,本人就是一个末流985毕业的,在学校属于那种不去上课都不会有人发现的那种,默默无闻,相信大多数人都跟我一样!毕业后并没有所谓的轰轰烈烈的爱情分手,也没有什么喝酒到天亮,找了个普普通通的公司就开始上班,像我这样平凡的人真的是一抓一大把啊。。。。。。转折是今年7月份,家里人身体不好的原因离了职回去,看着已经不再年轻的加人,自己真的不能再这样下去领取,自己那几个月疯狂看面经,刷面试题,背资料,上个月舍友问我字节现在有内推,你要不要来试试,我就去了,然后现在已经准备入

weixin_53170315的博客 3573

BAT互联网大厂JAVA岗高频面试题总结,看完offer成功率再翻一番

前言 近期根据网友分享大厂面试题目,今天我将网友面试的BAT等大厂JAVA岗面试题目整理出来,希望能够帮助大家! 阿里巴巴 1.题目:NFS 和 SMB 是最常见的两种 NAS(Network Attached Storage)协议,当把一个文件系统同时通过 NFS 和 SMB 协议共享给多个主机访问时,以下哪些说法是错误的:(多选) A. 不可能有这样的操作,即把一个文件系统同时通过 NFS 和 SMB协议共享给多个主机访问。 B. 主机 a 的用户通过NFS 协议创建的文件或者目录,另一个主机 b的用户

weixin_47955802的博客 1787

2025年C/C++高频面试题深度解析 | 掌握这些技巧,轻松斩获大厂Offer

虚表指针(vptr)位于对象首地址,继承体系中每个类拥有独立虚表。50+项技能树Checklist,快速定位技术短板!剑指Offer最优解合集,算法刷题必备神器!现代C++异步任务调度框架,提升开发效率!高性能网络库源码,深入理解事件驱动编程!涵盖23个核心考点,助你轻松应对面试!

C语言实战大全 2216

终于拿到了爆火全网的进一线大厂程序员必看的1700道java面试题

牛不牛不敢说,但是有好多程序员是靠这一套1700道高频面试题,顺利收到很多大厂offer!以至于,到现在为止,大厂都开始按照这一套1700道面试题来对程序员进行考核!这1700道java面试题包含的内容有:java基础、JVM、多线程、MySQL、spring、springboot、springcloud、dubbo、mybatis、redis、网络IO、Linux、MQ、zookeeper、netty、设计模式、算法、大数据相关知识、项目方面;可以说是非常全了,话不多说,直接上干货!

Park33的博客 333

一位读者刚刚收割阿里、腾讯等大厂Offer,他说这些话一定要和你们说一下

本文来自读者投稿,作者是我的一位资深读者,也是我知识星球的球友,最近在春招中收割了很多大厂的Offer。看了他总结后,我发现很多地方和我当年参加校招的时候很相像,甚至比我那个时候还要优秀。分享给大家,和大家一起共勉。 中间还有个小插曲,这位读者曾在准备参加校招之前,找我帮他指导过简历。后来我收到一份面试任务,仔细一看简历,怎么这么似曾相识,结果对比后发现正式我之前看过的那份。 因为我们认识,而且...

HollisChuang's Blog 3039

挑战40天准备Java面试,成功上岸字节,这就是最快拿到大厂offer的方式!(Java自学最强干货分享)

每个技术人都有个大厂梦,我觉得这很正常,并不是饭后的谈资而是每个技术人的追求。像阿里、腾讯、美团、字节跳动、京东等等的技术氛围与技术规范度还是要明显优于一些创业型公司/小公司,如果说能够在这样的公司锻炼几年,相信对自己能力的提升还是非常大的。那怎样才能快速拿到大厂的 Offer 呢?从业十多年,我从面试者变成面试官,在 Java 面试上积累了比较丰富的经验。其实,很多面试者在搜集面试资料的时候都踩过一些“坑”,你是不是也遇到过:为了规避这些“坑”,我跑了 20 多家互联网公司,来确认 Java 面试中实际考

m0_67645544的博客 757

写下千题助秋招,最新Android面试八股文突击大厂offer

进大厂是大部分程序员的梦想,而进大厂的门槛也是比较高的,对于Android开发的朋友来说应该是最全面最完整的面试备战仓库,为了更好地整理每个模块,我也参考了很多网上的优质博文和项目,力求不漏掉每一个知识点,很多朋友靠着这些内容进行复习,拿到了BATJ等大厂的offer, 也已经帮助了很多的Android开发学习者,希望也能帮助到你。

m0_64365896的博客 411

年薪40W毕业生大厂面试题合集,学完之后你不会拿不到offer

前言 网上找了很多的大厂Java面试题及部分资料,选取了其中10篇来作为本次的分享。以下为整理出来的文章,给大家分享。 java面试题及答案 第一篇 一面 手写ArrayList 手写进制转换算法,求出一个数的二进制数 1 的个数 JAVA 基础,equals 和== 多线程方式、threadlocal,各种锁,synchronized 和 lock 设计模式、spring 类加载方式、实例保存在哪、aop ioc、反射机制6、类加载器,双亲委派模型,热部署 jvm 内存模型,内存结构、堆

q1472750149的博客 698
上一篇: 求求大厂给个Offer:List面试题
下一篇: 别写秒杀系统了,我告诉你消息管理平台实现原理吧
Java3y
Java3y 领域专家: 后端开发技术领域 领域专家: 后端开发技术领域
博客等级 码龄9年 1万+粉丝 509原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值