你好,我是 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和线程池相关推荐

  1. 通信电子电路实验(二)—— 高频C类谐振功率放大器的设计与仿真

    文章目录 实验目的 技术指标 实验原理 实验要求 电路图与实验参数设计 电压瞬态分析 电压傅里叶分析 ici_cic​电流瞬时分析 输出功率和转换效率 ici_cic​输出波形随RcR_cRc​变化 ...

  2. java线程池面试题有哪些?java线程池常见面试题

    进行java面试的过程中,java线程池是必问的面试题目,因为这是java的重点知识,也是在java工作中经常会遇到的,那java线程池面试题有哪些?下面来我们就来给大家讲解一下java线程池常见面试 ...

  3. 超级实用的设计类网址导航--一流设计导航

    一流设计导航|16map 人性化分类且分类清晰 一流设计导航还贴心地提供了搜索栏,设计师可以拿来当百度用了(实现一站内,百度,GOOGLE,淘宝,BING互通). 一流设计导航还有专门的设计课程供小白 ...

  4. 一天十道Java面试题----第四天(线程池复用的原理------>spring事务的实现方式原理以及隔离级别)

    这里是参考B站上的大佬做的面试题笔记.大家也可以去看视频讲解!!! 文章目录 31.线程池复用的原理 32.spring是什么? 33.对Aop的理解 34.对IOC的理解 35.BeanFactor ...

  5. 腾讯面试题Java 并发包之线程池综述

    Java 并发包之线程池综述 ■ 线程池的创建 在Java中,您可以通过调整-Xss参数来调节每个线程栈的大小(64bit系统默认1024KB),当减小该值时意味着可以创建更多的线程数,但问题是JVM ...

  6. 为什么线程池里的方法会执行两次_面试官问你java都有哪些线程池,自己是否自定义过线程池...

    我还记得大学实习面试时,被问到什么是线程池这个问题,因为这个题我被录取了,原因就是我背出来了,而另外一个面试的没背出来,说实话当时还真不知道它是干什么的,就是看面试题给背下来了,在之后就是在实际开发中 ...

  7. 设计类网站的“联系我们”页面设计盘点

    诚然,能点到"联系我们"页面的多为有需求或有合作意向的用户,那么"联系我们"页面设计就要做到简洁.方便.下面小编就带领大家围观一下设计类网站的页面设计,来看看他 ...

  8. 计算机专业方面需要显卡,屏幕、显卡最重要 设计类电脑选购指南

    1设计类电脑的核心硬件配置 由于职业关系,经常有网友向笔者咨询:学习设计类专业需要配什么样的电脑?什么样的笔记本才适合设计类工作?或者举出几个设计类相关的软件,比如3D Max.Maya.Coreld ...

  9. 有了设计类导航网站,从此就不再需要瞎找了

    非常实用的设计类导航网站一流设计导航|16map 值得你收藏 因为它们背后站的可是一堆网站啊 不论是灵感创意还是搜罗素材 在这里都可以找得到 而且还有很多的工具神器 总之或许你们从此就不再需要瞎找了! ...

最新文章

  1. C指针9:指针数组(即数组中的每个元素都是指针)
  2. VMware Tools手动下载
  3. 意大利物联网技术发展现状
  4. jqueryIFrame框架内元素操作
  5. python修改excel后打印_python 处理excel并打印excel
  6. 我在SAP这么多年使用过的IDE
  7. 中断系统详解、外部中断
  8. 新思科技与台积电开发基于N4P制程的最广泛IP核组合
  9. CLRS10.1-6练习 - 用双栈实现队列
  10. 以太坊本地开发环境搭建
  11. android monkey 测试方法实践
  12. body-parser和multer
  13. sql与mysql数据对接_SQL Server 对接MySQL 数据库
  14. J2ME开发入门专题系列之一:J2ME概述
  15. 【JAVA】java获取项目地址或tomcat绝对地址
  16. A/B/C类ip地址 掩码 广播地址 路由汇集 保留地址
  17. “点亮心灯祝福世界·清明” 活动暨“生与死的艺术沙龙清明特场”启动
  18. Bug软件缺陷管理制度
  19. shio世硕AI智慧指读学习机加入智能教育硬件新战场【无标题】
  20. word中如何在方框中打钩

热门文章

  1. php用户类,php用户登陆类
  2. 用C语言实现扫雷小游戏(附上思路+项目展示+源代码)
  3. poj1002(map的使用)
  4. [湖南集训]更为厉害 树上主席树-以树深度为下下标建立主席树
  5. CF911G Mass Change Queries (线段树区间 合并)
  6. android侧滑布局,Android布局控件DrawerLayout实现完美侧滑效果
  7. 抢红包算法 c语言,红包分配算法,抢红包算法
  8. 梯度倒谱matlab程序,MFCC梅尔倒谱参数及matlab代码
  9. 排序算法—sort(),stable_sort(),merge()
  10. C#写webservice(2)