天下无难试之HashMap面试刁难大全

腾讯2020后台暑期实习一面试试水。感觉还是挺难的。 前段时间看到腾讯有后台实习,本来以为是日常实习,所以就抱着试试的心态投递了我那单薄的简历,没想到过了一个星期居然收到了腾讯打来的电话,可惜,当时中午的时候我在学习,我一般学习的时候大部分时间手机都是开的免打扰,所以就理所应当的错过了腾讯的这个面试安排电话,等我发现的时候已经过了一个小时,然后我就尝试打了过去,它那是座机电话,应该是公司专用的,所以只能他打给我,然后我就赶紧搜别人遇到这种情况会怎么样,查到的都是说这次面试机会就没有了,顿时心里就感觉挺可惜的,然后心里还安慰自己(可能还是和腾讯无缘吧)... 阅读详情

0?wx_fmt=jpeg

HashMap的结构无疑是Java面试中出现频率最高的一道题,这个题是如此之常见,应该每个人都会信手拈来。可是就在我经历过的无数【允许我夸张一下】面试当中,能完整回答我提出的HashMap问题的人却是寥寥无几,如今这道题我已经问的有点厌烦了。

HashMap的结构是怎样的?

二维结构,第一维是数组,第二维是链表

Get方法的流程是怎样的?

先调用Key的hashcode方法拿到对象的hash值,然后用hash值对第一维数组的长度进行取模,得到数组的下标。这个数组下标所在的元素就是第二维链表的表头。然后遍历这个链表,使用Key的equals同链表元素进行比较,匹配成功即返回链表元素里存放的值。

Get方法的时间复杂度是多少?

小伙伴们在回答这道题是有很多人会开始怀疑人生,他们的脑细胞这个时候会出现短路现象。明明是O(1)啊,平时都记得牢牢的,可是刚才Get方法的流程里需要遍历链表,遍历的时间复杂度难道不是O(n)么?此刻观察这些孩子们的表情是非常卡哇伊呢的。当然还有些甚至是科班的小伙伴居然没听过时间复杂度,想到这里我也开始怀疑人生了。当他们卡壳的时候,我会稍微提醒一下,问下面的这一道题。

假如HashMap里的元素有100w个,请问第二维链表的长度大概是多少?

嗦嘎!链表的长度很短,相比总元素的个数可以忽略不计。这个时候小伙伴们的眼睛通常会开始发光,很童贞。作为面试官是很喜欢看到这种眼神的。我使用反射统计过HashMap里面链表的长度,在HashMap里放了100w个随机字符串键值对,发现链表的长度几乎从来没有超过7这个数字,当我增大loadFactor的时候,才会偶尔冒出几个长度为8的链表来。于是问题又来了。

既然链表如此短,为啥Java8要对HashMap的链表进行改造,使用红黑树来代替链表呢?

有很多同学都没具体去深入关注Java8的新特性,如果他们回答不上来,我也不会感到失望。因为到这个问题的时候,已经只剩下15%的同学不到了,如果再打击他们,看着他们落寞的身影走出了大门,我都要对自己感到失望了,怎么招个人就如此困难?

这道题的关键在于如果Key的hashcode不是随机的,而是人为特殊构造的话,那么第二维链表可能会无比的长,而且分布极为不均匀,这个时候就会出现性能问题。比如我们把对象的hashcode都统一返回一个常量,最终的结果就是hashmap会退化为一维链表,Get方法的性能巨降为O(n),使用红黑树可以将性能提升到O(log(n))。

0?wx_fmt=jpeg

请解释一下HashMap的参数loadFactor,它的作用是什么?

loadFactor表示HashMap的拥挤程度,影响hash操作到同一个数组位置的概率。默认loadFactor等于0.75,当HashMap里面容纳的元素已经达到HashMap数组长度的75%时,表示HashMap太挤了,需要扩容,在HashMap的构造器中可以定制loadFactor。

请说明一下HashMap扩容的过程

扩容需要重新分配一个新数组,新数组是老数组的2倍长,然后遍历整个老结构,把所有的元素挨个重新hash分配到新结构中去。这个rehash的过程是很耗时的,特别是HashMap很大的时候,会导致程序卡顿,而2倍内存的关系还会导致内存瞬间溢出,实际上是3倍内存,因为老结构的内存在rehash结束之前还不能立即回收。那为什么不能在HashMap比较大的时候扩容扩少一点呢,关于这个问题我也没有非常满意的答案,我只知道hash的取模操作使用的是按位操作,按位操作需要限制数组的长度必须是2的指数。另外就是Java堆内存底层用的是tcmalloc这类library,它们在内存管理的分配单位就是以2的指数的单位,2倍内存的递增有助于减少内存碎片,减少内存管理的负担。

HashMap是线程安全的么?

当然不是,线程安全的HashMap是ConcurrentHashMap。关于ConcurrentHashMap还可以问很多问题,这就需要另一篇文章来具体讲解了。

你了解Redis么,你知道Redis里面的字典是如何扩容的么?

好,如果这道题你也回答正确了,恭喜你,毫无无疑,你是一位很有钱途的高级程序员。

你了解Python么,你知道Python里面字典的结构是怎样的么?

这个就属于附加题了,如果这道题你也回答对了,那我的眼睛就要发射紫外线了。

0?wx_fmt=jpeg

更换光猫的原理与方法 当你给装维打电话说你需要更换光猫时,对于装维来说,他并不需要知道怎么更换,他只需要生成一张工单,由后台进行业务操作后,在去用户家把新光猫给装好即可,此时装维到底起到了什么作用呢?我想可能只是运输员吧,把一个设备从一个地方运到另一个地方罢了,此时并不能指望装维做什么,因为本质上来说装维的能力真的很差很差,我是不知道那些装维哪来的勇气做视频,还说自己什么什么能力很强?很强吗?吹牛的技术确实很强。 更换光猫之前,需要先明白为什么要更换光猫,怎么更换光猫,更换后不能用怎么办?怎么才能更换成功,换光猫以后被限速了怎么 阅读详情

相关推荐

UR机械臂正逆运动学解析:从DH参数到8组解的完整求解策略

本文深入解析UR机械臂的正逆运动学求解策略,从DH参数原理到完整的8组解求解方法。详细介绍了正运动学的坐标变换过程,以及逆运动学中Atan2函数和三角恒等变换的应用,并揭示了8组解的产生机制。通过实际案例和调试技巧,帮助工程师掌握UR机械臂运动学求解的核心技术。

weixin_29094775的博客 414

HashMap

HashMap的结构无疑是Java面试中出现频率最高的一道题,这个题是如此之常见,应该每个人都会信手拈来。可是就在我经历过的无数【允许我夸张一下】面试当中,能完整回答我提出的HashMap问题的人却是寥寥无几,如今这道题我已经问的有点厌烦了。 HashMap的结构是怎样的? 二维结构,第一维是数组,第二维是链表 Get方法的流程是怎样的? 先调用Key的hashcode方法拿到对象的has

lovesimly的专栏 253

当LightGBM推理遇上GPU:3种替代方案性能对比(含ONNX实战代码)

本文针对LightGBM官方不支持GPU推理的性能瓶颈,深度评测了RAPIDS cuML、ONNX Runtime GPU和Triton Inference Server三种GPU加速推理替代方案。通过详尽的性能对比和实战代码,为高并发、低延迟的在线预测场景提供了清晰的选型指南,帮助工程师打破推理性能枷锁,实现显著的吞吐量提升。

salt9的博客 813

Java中HashMap结构自身占用的内存和Runtime类的freeMemory()等几个方法

转自:http://hi.baidu.com/calls911/blog/item/c0ed39da95379f3f33fa1c98.html 1、HashMap结构自身占用的内存 通过如下手段测试HashMap结构自身在存放一百万个键值对时占用的内存大小: HashMap hm1 = new HashMap; for (int i = 0; i < 1000000; ++i){ ...

twinkleliang的专栏 313

从零构建:STM32与EC800 4G模块的工业物联网数据透传实战

本文详细介绍了如何从零构建STM32与EC800 4G模块的工业物联网数据透传系统。内容涵盖硬件选型、抗干扰电路设计、AT指令稳定性优化、网络连接管理、可靠数据透传协议以及低功耗策略,为开发者提供了一套可直接应用于工业场景的完整实战方案。

uran的专栏 1017

电源芯片TPS54560典型应用电路及设计详解

TPS54560 是一款配有集成型高侧 MOSFET 的 60V、5A DC-DC转换器,输入电压范围7-60V,输出电压可通过外部反馈电阻设置成略低于输入电压的任意值。**所以,**R5=31.25KΩ、R6:10KΩ(常用值)时,即可设置输出电压为 3.3V。**所以,**R5=140KΩ、R6:10KΩ(常用值)时,即可设置输出电压为12V。设计 TPS54560 的输出电压时,主要通过外部反馈电阻网络来设置输出电压。因此,输出 3.3V ,输入电压24V时推荐的电感值为 8µH 至 10µH。

weixin_42306872的博客 1万+

HashMap详解

一、HashMap集合简介 HashMap 基于哈希表的 Map 接口实现,是以 key-value 存储形式存在,即主要用来存放键值对。HashMap 的实现不是同步的,这意味着它不是线程安全的。它的 key、value 都可以为 null,此外,HashMap 中的映射不是有序的。 jdk1.8 之前 HashMap 由 数组 + 链表 组成,数组是 HashMap 的主体,链表则是主要为了解决哈希冲突(两个对象调用的 hashCode 方法计算的哈希值经哈希函数算出来的地址被别的元素占用)而存

java123456111的博客 5万+

模板匹配加速之金字塔分层搜索

图像金字塔是一种多分辨率图像表示方法,它通过一系列逐渐缩小或放大的图像来表示原始图像的不同尺度。高斯金字塔(Gaussian Pyramid):通过不断下采样(降采样)生成更小的图像。拉普拉斯金字塔(Laplacian Pyramid):通过高斯金字塔和差分操作生成一组残差图像。在模板匹配中,我们主要使用高斯金字塔来实现多尺度匹配。金字塔灰度模板匹配通过多尺度搜索策略,在保持较高准确率的同时显著提升匹配速度,尤其适用于:高分辨率图像处理实时检测系统移动端设备等资源受限场景。

weixin_44969144的博客 1733

Java8的HashMap详解(存储结构,功能实现,扩容优化,线程安全,遍历方法)

原文:Java 8系列之重新认识HashMap,有删改。 JDK1.8对HashMap底层的实现进行了优化,例如引入红黑树的数据结构和扩容的优化等。本文结合JDK1.7和JDK1.8的区别,深入探讨HashMap的结构实现和功能原理,文章末尾附有HashMap的put方法和resize方法的源码解析。简介Java为数据结构中的映射定义了一个接口java.util.Map,此接口主要有四个常用的实现

login_sonata的博客 2万+

STM32驱动电磁阀电路设计:从光耦选型到MOSFET驱动的实战解析

本文深入解析了STM32驱动24V电磁阀的完整电路设计,重点探讨了光耦选型与MOSFET驱动两大核心环节。针对电平转换与电气隔离需求,详细对比了EL357N与TLP2310等光耦在CTR、速度及耐压等关键参数上的差异与应用场景。同时,文章提供了MOSFET关键参数解读、驱动电路优化方案(如推挽驱动)以及完整的PCB布局、电源处理与调试避坑指南,旨在帮助工程师构建稳定可靠的工业控制电路。

weixin_29184371的博客 234

告别底噪与失真:手把手教你调校WM8988音频Codec的输入输出增益链

本文详细介绍了如何调校WM8988音频Codec的输入输出增益链,解决底噪与失真问题。从模拟输入增益、数字转换增益到输出放大增益,提供了具体的寄存器配置和调试策略,帮助开发者优化音频信号处理链,提升音质表现。

weixin_30485379的博客 365

HashMap相关面试题

HashMap的数据结构: 底层使用hash表数据结构,即数组和链表或红黑树。

m0_62925761的博客 767

提示词工程在机器翻译质量提升中的应用

Introduction to Prompt Engineering in Machine Translation Quality Improvement Keywords

AI天才研究院 1151

码洞技术文章大全

全栈虚拟机GraalVM初体验基于Netty自己动手编写RPC框架自己动手实现一个极简Web框架水塘抽样与阶层固化深度解析某头条的一道面试题基于Netty实现Redis协...

codehole_的博客 284

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

分享下昨天下午京东视频面试的面试题,看看你能回答几个

京东最新面试 1.数组和链表的区别? 2.单向链表和闭环链表,你了解闭环链表吗 3.给你一个参数节点怎么判断是闭环列表 JDK里的常用类有哪些呢? 4.有用过Hashmap吗?实现原理是什么? 5.为什么宏微数是二参数? 6.数据库mysql组件索引和非组件索引有什么区别? 7.有一个日用文件,非常大500g,记录了很多网站地址,给你一台电脑4个g,硬盘不限制,让你找到请求地址访问人数最多的前5条记录,你怎么实现? 8.介绍你做过的项目的项目架构 9.系统用户数到了1000万,你要对性能进行改造,你会怎么做

波波烤鸭的博客 2630

visio安装包

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

面试详解之Java8为什么用红黑树来实现HashMap

面试详解之Java8之后使用红黑树来实现HashMap

九离的博客 3415

android 蓝牙通讯demo

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

码洞原创深度技术文章大全 —— 高端面试必备

《快学 Go 语言》第 11 课 —— 协程《快学 Go 语言》第 10 课 —— 错误与异常《快学 Go 语言》第 9 课 —— 接口《快学 Go 语言》第 8 课 —...

codehole_的博客 293

Java开发实习面试总结(49分钟)

前述: 在这里记录总结一下第一次面试经历。 前段时间投的简历,这两天准备期末考试(怂,就靠这两冲刺那。。),把面试的事搁置了,昨天下午HR突然打电话来直接要求技术面试,然后我只能说不方便了。。。明天十一点可以吗。。。可以! 温馨提示:面试还是得早点就做好准备的(我之前准备了,利用这几个小时好温习一下)。 正文: 不说那么多废话了,开始面试问题吧。 1、先介绍一下自己吧 啦啦啦啦。。。就介绍完了,建...

璟矢 8665

大厂Java面试高频八股文:从HashMap到JVM的深度备战指南

在技术面试中,“八股文”常被热议,它本质上是面试官最低成本的筛选工具,用来快速评估候选人的基础扎实度、技术热情与沟通逻辑。像HashMap的底层实现、JVM内存模型、线程池参数以及MySQL索引结构等经典考点,表面是记忆题,实则考察你是否理解背后的设计权衡与原理。例如,HashMap为何用红黑树、volatile为何不能保证原子性、B+树为何能支撑千万级数据,这些追问层层递进,能有效区分“背答案”与“真懂”。对于求职者而言,建立考点地图、用“原理-问题-代价”三层法消化知识,并通过模拟面试自测,就能把八股文

weixin_33831196的博客 391

Java面试-Java 集合框架整体结构图与面试高频考点

《Java集合框架与高频面试考点速览》 本文系统梳理了Java集合框架的核心结构与面试要点。主要内容包括: 框架总览:Collection和Map两大接口构成基础,分别处理单值集合和键值对存储。 Collection三大子接口: List(有序可重复):重点对比ArrayList(数组,查询快)和LinkedList(链表,增删快) Set(唯一性):HashSet与TreeSet实现差异 Queue:队列特性与实现 Map家族详解:HashMap底层结构、TreeMap排序特性及并发安全实现。 并发集合:

千淘万漉虽辛苦,吹尽狂沙始到金 2万+
上一篇: 以太坊合约分析之远程购买
下一篇: 徒手教你使用zookeeper编写服务发现
码洞
博客等级 码龄10年 41粉丝 137原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值