两个高频设计类面试题:如何设计HashMap和线程池
你好,我是 yes。
最近在汇总面试题,但是我写的这个版本不是背诵版,不是那种死记硬背刻板的答案。
我的本意是抛砖引玉,针对每个题目给出我自己的理解和解释型的答案,然后背诵版本需要你们自行去总结和记忆。
因为八股文在面试中是一定要的,也就是该知道的题还是得知道的,而在理解的基础上记忆会比较深刻,并且可以应对一些变种问题。
但是不清楚这样的形式是不是受欢迎,所以我暂时拿两个题目先发出来看看反响。
所以如果觉得这样的形式哪里不好,需要改进的话,请留言。
1.如果让你设计一个 HashMap 如何设计?
这个问题我觉得可以从 HashMap 的一些关键点入手,例如 hash 函数、如何处理冲突、如何扩容。
可以先说下你对 HashMap 的理解。
比如:HashMap 无非就是一个存储 <key,value> 格式的集合,使得通过 key 在 O(1) 的时间复杂下就能查找到 value。
基本原理就是将 key 经过 hash 函数进行散列得到散列值,然后通过散列值对数组取模得到对应的 index 。
所以 hash 函数很关键,不仅运算要快,还需要分布均匀,减少 hash 碰撞。
而因为输入值是无限的,而数组的大小是有限的所以肯定会有碰撞,因此可以采用拉链法来处理冲突。
为了避免恶意的 hash 攻击,当拉链超过一定长度之后可以转为红黑树结构。
当然超过一定的结点还是需要扩容的,不然碰撞就太严重了。
而普通的扩容会导致某次 put 延时较大,特别是 HashMap 存储的数据比较多的时候,所以可以考虑和 redis 那样搞两个 table 延迟移动,一次可以只移动一部分。
不过这样内存比较吃紧,所以也是看场景来 trade off 了。
还有,最好使用之前预估准数据大小,避免频繁的扩容。
基本上这样答下来差不多了,HashMap 几个关键要素都包含了,接下来就看面试官怎么问了。
可能会延伸到线程安全之类的问题,反正就照着 currentHashMap 的设计答。
其实有些题目看起来是问如何设计,实际上你就答你对这个东西是怎么理解的,把它原理和一些要点讲一讲这个题目就过了。
比如我上面说的预估准数据的大小,这种看起来和设计没关系,但是可以让面试官知道你对这种方面是敏感的就够了。
所以有时候的“答非所问”是 OK 的,如果面试官觉得你答的方向不对,自然而然会提醒你,到时候你再接招就好了。
简单地说,很多提问不是真的要死板的对着面试题而回答,因为面试官也只是笼统地问。
2.如果让你设计一个线程池如何设计?
这种设计类问题还是一样,先说下理解,表明你是知道这个东西的用处和原理的,然后开始 BB。基本上就是按照现有的设计来说,再添加一些个人见解。
线程池讲白了就是存储线程的一个容器,池内保存之前建立过的线程来重复执行任务,减少创建和销毁线程的开销,提高任务的响应速度,并便于线程的管理。
我个人觉得如果要设计一个线程池的话得考虑池内工作线程的管理、任务编排执行、线程池超负荷处理方案、监控等方面。
要将初始化线程数、核心线程数、最大线程池都暴露出来可配置,包括超过核心线程数的线程空闲消亡相关配置。
然后任务的存储结构也得可配置,可以是无界队列也可以是有界队列,也可以根据配置,分多个队列来分配不同优先级的任务,也可以采用 stealing 的机制来提高线程的利用率。
再提供配置来表明此线程池是 IO 密集型还是 CPU 密集型来改变任务的执行策略。
超负荷的方案可以有多种,包括丢弃任务、拒绝任务并抛出异常、丢弃最旧的任务或自定义等等。
至于监控的话,线程池设计要埋好点,暴露出用于监控的接口,如已处理任务数、待处理任务数、正在运行的线程数、拒绝的任务数等等信息。
我觉得基本上这样答就差不多了,等着面试官的追问就好。
注意不需要跟面试官解释什么叫核心线程数之类的,都懂的没必要。
当然这种开放型问题还是仁者见仁智者见智,我这个不是标准答案,仅供参考。
建议把线程池相关的关键字都要说出来,表面你对线程池的内部原理的理解是透彻的。
特别推荐一个分享架构+算法的优质内容,还没关注的小伙伴,可以长按关注一下:
长按订阅更多精彩▼如有收获,点个在看,诚挚感谢
两个高频设计类面试题:如何设计HashMap和线程池相关推荐
- 通信电子电路实验(二)—— 高频C类谐振功率放大器的设计与仿真
文章目录 实验目的 技术指标 实验原理 实验要求 电路图与实验参数设计 电压瞬态分析 电压傅里叶分析 ici_cic电流瞬时分析 输出功率和转换效率 ici_cic输出波形随RcR_cRc变化 ...
- java线程池面试题有哪些?java线程池常见面试题
进行java面试的过程中,java线程池是必问的面试题目,因为这是java的重点知识,也是在java工作中经常会遇到的,那java线程池面试题有哪些?下面来我们就来给大家讲解一下java线程池常见面试 ...
- 超级实用的设计类网址导航--一流设计导航
一流设计导航|16map 人性化分类且分类清晰 一流设计导航还贴心地提供了搜索栏,设计师可以拿来当百度用了(实现一站内,百度,GOOGLE,淘宝,BING互通). 一流设计导航还有专门的设计课程供小白 ...
- 一天十道Java面试题----第四天(线程池复用的原理------>spring事务的实现方式原理以及隔离级别)
这里是参考B站上的大佬做的面试题笔记.大家也可以去看视频讲解!!! 文章目录 31.线程池复用的原理 32.spring是什么? 33.对Aop的理解 34.对IOC的理解 35.BeanFactor ...
- 腾讯面试题Java 并发包之线程池综述
Java 并发包之线程池综述 ■ 线程池的创建 在Java中,您可以通过调整-Xss参数来调节每个线程栈的大小(64bit系统默认1024KB),当减小该值时意味着可以创建更多的线程数,但问题是JVM ...
- 为什么线程池里的方法会执行两次_面试官问你java都有哪些线程池,自己是否自定义过线程池...
我还记得大学实习面试时,被问到什么是线程池这个问题,因为这个题我被录取了,原因就是我背出来了,而另外一个面试的没背出来,说实话当时还真不知道它是干什么的,就是看面试题给背下来了,在之后就是在实际开发中 ...
- 设计类网站的“联系我们”页面设计盘点
诚然,能点到"联系我们"页面的多为有需求或有合作意向的用户,那么"联系我们"页面设计就要做到简洁.方便.下面小编就带领大家围观一下设计类网站的页面设计,来看看他 ...
- 计算机专业方面需要显卡,屏幕、显卡最重要 设计类电脑选购指南
1设计类电脑的核心硬件配置 由于职业关系,经常有网友向笔者咨询:学习设计类专业需要配什么样的电脑?什么样的笔记本才适合设计类工作?或者举出几个设计类相关的软件,比如3D Max.Maya.Coreld ...
- 有了设计类导航网站,从此就不再需要瞎找了
非常实用的设计类导航网站一流设计导航|16map 值得你收藏 因为它们背后站的可是一堆网站啊 不论是灵感创意还是搜罗素材 在这里都可以找得到 而且还有很多的工具神器 总之或许你们从此就不再需要瞎找了! ...
最新文章
- C指针9:指针数组(即数组中的每个元素都是指针)
- VMware Tools手动下载
- 意大利物联网技术发展现状
- jqueryIFrame框架内元素操作
- python修改excel后打印_python 处理excel并打印excel
- 我在SAP这么多年使用过的IDE
- 中断系统详解、外部中断
- 新思科技与台积电开发基于N4P制程的最广泛IP核组合
- CLRS10.1-6练习 - 用双栈实现队列
- 以太坊本地开发环境搭建
- android monkey 测试方法实践
- body-parser和multer
- sql与mysql数据对接_SQL Server 对接MySQL 数据库
- J2ME开发入门专题系列之一:J2ME概述
- 【JAVA】java获取项目地址或tomcat绝对地址
- A/B/C类ip地址 掩码 广播地址 路由汇集 保留地址
- “点亮心灯祝福世界·清明” 活动暨“生与死的艺术沙龙清明特场”启动
- Bug软件缺陷管理制度
- shio世硕AI智慧指读学习机加入智能教育硬件新战场【无标题】
- word中如何在方框中打钩
热门文章
- php用户类,php用户登陆类
- 用C语言实现扫雷小游戏(附上思路+项目展示+源代码)
- poj1002(map的使用)
- [湖南集训]更为厉害 树上主席树-以树深度为下下标建立主席树
- CF911G Mass Change Queries (线段树区间 合并)
- android侧滑布局,Android布局控件DrawerLayout实现完美侧滑效果
- 抢红包算法 c语言,红包分配算法,抢红包算法
- 梯度倒谱matlab程序,MFCC梅尔倒谱参数及matlab代码
- 排序算法—sort(),stable_sort(),merge()
- C#写webservice(2)