Java面试官VS水货程序员谢飞机:HashMap、线程池、Redis实战三连问

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同时过期
    • 解决:随机过期时间 + 多级缓存 + 熔断降级
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值