后端面试有个残酷现实:八股文背得再熟,面试官换个问法就能试出深浅。下面这20道题,覆盖Java基础、并发、JVM、数据库、缓存、消息队列、分布式和网络。不是让你死记答案,而是检验你是否真正理解“为什么”。答不上来的,可能不是不会,而是没踩过坑。
Java基础
String为什么设计成不可变?——考察不可变对象、字符串常量池、线程安全与哈希缓存。
HashMap的扩容机制?为什么容量是2的幂?——考察哈希扰动、rehash、位运算优化。
==和equals的区别?重写equals为什么要重写hashCode?——考察对象相等性契约。
并发编程
synchronized锁升级过程?偏向锁撤销为什么要STW?——考察JVM自适应优化与安全点。
volatile如何保证可见性和有序性?为什么不保证原子性?——考察JMM与内存屏障。
线程池核心参数怎么设?拒绝策略怎么选?——考察CPU/IO密集型分析与压测验证。
AQS为什么用CLH队列变体?——考察自旋 vs 阻塞的权衡,以及state+CAS设计。
JVM
JVM内存区域怎么划分?堆和栈的区别?——考察线程私有与共享、OOM场景。
G1和CMS的区别?什么场景用哪个?——考察垃圾回收器演进与停顿目标。
类加载过程?双亲委派为什么被打破?——考察加载、链接、初始化与SPI、热部署。
数据库
B+树为什么适合做索引?和B树、哈希索引的区别?——考察磁盘IO、范围查询与页分裂。
事务隔离级别?MVCC如何实现可重复读?——考察undo log、read view与幻读。
慢SQL怎么优化?explain看哪些字段?——考察索引失效、回表、覆盖索引与执行计划。
缓存
Redis持久化RDB和AOF怎么选?——考察数据安全与恢复速度的权衡。
缓存穿透、击穿、雪崩的区别与解决方案?——考察布隆过滤器、互斥锁、过期时间打散。
Redis分布式锁怎么实现?Redlock争议在哪?——考察SETNX、续期、时钟漂移与一致性。
消息队列
Kafka为什么快?零拷贝和顺序写怎么做到的?——考察PageCache、sendfile、分区并行。
如何保证消息不丢失?幂等怎么设计?——考察生产端acks、消费端手动提交、唯一ID去重。
分布式与网络
CAP怎么选?BASE和分布式事务方案?——考察TCC、Saga、本地消息表与最终一致。
TCP三次握手为什么不是两次?HTTPS握手过程?——考察序列号同步、SYN Flood与证书验证。
这20道题,能流畅答出15道以上,后端岗位基本稳了;答不上10道,建议先别急着投简历。但要注意:面试官真正想听的,不是标准答案,而是你结合项目经验的思考。比如问线程池,你能说出“我们线上核心数8,队列用LinkedBlockingQueue,拒绝策略CallerRuns,压测后调整到12”,比背公式强十倍。
技术栈面试的真相是:广度决定能不能进面,深度决定能不能拿offer。把每道题背后的“为什么”搞清楚,再找一个真实场景串起来,你就超过了80%的候选人。