面试现场
面试官:今天咱们来聊聊Java核心知识。范同学,Object类的equals()方法和==有什么区别?
范小旭:这个...==比较地址,equals默认也是比较地址,但可以重写对吧?(偷偷看简历)
面试官:不错,那线程池的核心参数有哪些?如何避免OOM?
范小旭:核心线程数、最大线程数、队列容量...(支支吾吾)如果队列满了就直接new Thread?
面试官:(扶额)那HashMap在并发场景下有什么问题?
范小旭:啊...死循环?树化?(突然站起来)我之前遇到过,用ConcurrentHashMap就解决了!
高级环节
面试官:Spring的Bean生命周期有几个阶段?
范小旭:实例化、属性赋值、初始化...(突然掏出手机)我用@PostConstruct写过初始化代码!
面试官:Redis的ZSet底层实现是什么?如何处理海量数据?
范小旭:(翻白眼)这不就是红黑树吗?(突然警觉)啊不对,是跳表加哈希表!
终面提问
面试官:MySQL的索引优化有哪些策略?
范小旭:(突然认真)最左匹配原则...联合索引要按顺序?(掏出笔记本)我之前用Explain分析过慢查询!
面试官:Docker网络模式有哪几种?如何实现服务发现?
范小旭:(突然结巴)桥接模式...还有...(看时间)我之前用Nginx做反向代理!
答案解析
- HashMap并发问题:扩容时链表转红黑树可能导致死循环,建议使用ConcurrentHashMap
- 线程池拒绝策略:AbortPolicy/CallerRunsPolicy等,需根据业务选择
- Redis跳表:由多层链表组成,支持O(logN)复杂度的插入查询
- MySQL索引优化:使用覆盖索引、避免SELECT *,合理设计联合索引顺序
- Docker网络:host模式共享主机网络,bridge模式通过NAT转发,overlay用于集群