Java面试官VS水货程序员谢飞机:HashMap、线程池、Redis实战三连问
第一轮:基础中的战斗机
面试官:谢飞机,看你简历写了精通Java,那先来个简单的。HashMap的底层数据结构是什么?1.8有什么变化?
谢飞机:啊哈!这个我会!就是数组加链表嘛!1.8改成数组加链表加红黑树!当链表长度超过8就变树,低于6又变回链表!(得意地搓手)
面试官:不错不错,看来基础还算扎实。那你知道为什么是8和6这个阈值吗?
谢飞机:呃...因为...8是吉利数字?666的意思?(挠头)其实我觉得7也行,9也不错...
面试官:(扶额)好吧...下一个问题。ArrayList和LinkedList的区别?项目中怎么选?
谢飞机:这个简单!ArrayList查询快,LinkedList插入删除快!我们项目都用ArrayList,因为老板说查询多!(突然压低声音)其实是因为我不会用LinkedList...
面试官:(忍住笑)最后一个问题,Spring Bean的生命周期你了解吗?
谢飞机:Bean的生命?从生到死对吧!先是new出来,然后@Autowired注入,最后被GC回收!中间还可能被@PostConstruct和@PreDestroy调戏一下!
面试官:虽然表述不太专业...但大体意思对了。进入下一轮。
第二轮:进阶中的过山车
面试官:现在考考并发。线程池的核心参数有哪些?你们项目用的什么配置?
谢飞机:核心线程数、最大线程数、队列大小、拒绝策略!我们项目...(翻看手机备忘录)哦对,用了200个核心线程,队列是无界的!因为产品经理说系统要支持百万并发!
面试官:(震惊)200核心线程?无界队列?你们服务器多少钱租的?知道这样配置的风险吗?
谢飞机:风险?风险就是...服务器会很热?要多开几个风扇?(认真脸)不过我们运维小哥说加钱就能解决!
面试官:(深呼吸)好吧...JVM内存模型说说?堆和栈的区别?
谢飞机:堆是放对象的,栈是放方法的!就像...堆是仓库,栈是流水线!对象在堆里躺着,方法在栈里跑来跑去!(手舞足蹈比划)
面试官:勉强过关...最后一个问题,MySQL的索引类型有哪些?B+树为什么适合做数据库索引?
谢飞机:索引有...主键索引、唯一索引、普通索引!B+树嘛...因为它长得像圣诞树!节点多,查找快!(突然灵光一闪)而且叶子节点连在一起,范围查询特别爽!
面试官:(惊讶)这个回答居然...还不错?进入最后一轮。
第三轮:高能中的核弹
面试官:分布式场景。Redis缓存穿透、击穿、雪崩怎么解决?
谢飞机:穿透就是...有人拿不存在的key狂打我们!击穿是热点key突然失效!雪崩是所有key一起失效!解决方案嘛...(抓耳挠腮)给Redis买个保险?或者...找个风水大师给服务器看看?
面试官:(无语)那你说说布隆过滤器原理?
谢飞机:布隆...是个外国人的名字?过滤器就是筛子!合起来就是...布隆牌筛子?(看到面试官脸色)开玩笑的!其实就是用多个哈希函数把数据映射到位图上!
面试官:最后一个问题,微服务之间调用,Dubbo和Spring Cloud怎么选?熔断降级怎么做?
谢飞机:Dubbo是阿里出的,Spring Cloud是Spring出的!选哪个?当然是...看谁给的钱多!(正经脸)熔断就是保险丝,电流太大就断掉!降级就是...把高清视频变成黑白的!
面试官:(叹气)今天的面试就到这里吧。你的基础知识还算可以,但深度不够。回去等通知吧,有消息HR会联系你。
谢飞机:太好了!等通知是不是意味着...稳了?(蹦蹦跳跳出门,撞到门框)哎哟!
技术点详解
1. HashMap底层结构及优化
业务场景:电商系统用户购物车功能,需要快速根据商品ID查找商品信息。
- 数据结构:数组+链表+红黑树(JDK1.8)
- 阈值设计:链表长度>8转红黑树,<6转回链表
- 为什么是8和6:基于泊松分布,链表长度为8的概率极低(约0.00000006),避免频繁转换;6作为回退阈值提供缓冲区
- 性能对比:链表O(n) vs 红黑树O(logn),当n=8时,树的优势明显
2. 线程池参数配置与风险
业务场景:秒杀系统需要处理突发流量。
- 核心参数:
- corePoolSize:常驻线程数
- maximumPoolSize:最大线程数
- workQueue:任务队列
- keepAliveTime:空闲线程存活时间
- rejectedExecutionHandler:拒绝策略
- 合理配置:
- CPU密集型:corePoolSize = CPU核心数+1
- IO密集型:corePoolSize = CPU核心数*2
- 队列建议使用有界队列(如ArrayBlockingQueue)
- 风险分析:
- 无界队列:可能导致OOM
- 过大线程数:上下文切换开销大,CPU利用率下降
3. Redis缓存三大问题解决方案
业务场景:新闻资讯APP热点文章缓存。
- 缓存穿透:
- 问题:查询不存在的数据,直接打到数据库
- 解决:布隆过滤器 + 缓存空值
- 布隆过滤器原理:多个哈希函数映射位图,存在误判率但空间效率高
- 缓存击穿:
- 问题:热点key过期瞬间大量请求打到数据库
- 解决:互斥锁 + 逻辑过期(设置较长过期时间,在value中记录真实过期时间)
- 缓存雪崩:
- 问题:大量key同时过期
- 解决:随机过期时间 + 多级缓存 + 熔断降级
487

被折叠的 条评论
为什么被折叠?



