
面试是有规律可循的。这篇文章总结了我15次面试中反复出现的问题附上我的回答思路。前言秋招期间我一共面了15家公司字节、阿里、美团、腾讯、小红书、快手、百度…拿到了5个offer。面完之后我做了一个统计把所有被问到的问题归类发现其实来来回回就是那些问题。面试官可能换个说法、换个场景但考察的核心知识点是固定的。今天把高频问题和回答套路分享出来。一、自我介绍每场必有一个好的自我介绍时间1.5-2分钟 结构我是谁 我会什么 我做过什么 我为什么合适 示例 面试官您好我是XX大学计算机专业大四学生。 技术方面我主要做Java后端开发对Spring Boot、MySQL、Redis、 消息队列这些技术栈比较熟悉也了解一些分布式系统的设计。 项目方面我做过两个比较有技术深度的项目 一个是高并发秒杀系统通过多级缓存和MQ异步下单把QPS做到了1.2万 另一个是实时数据同步平台基于CanalKafka实现了MySQL到ES的实时同步。 我平时也会写技术博客目前在CSDN上有XX篇文章总阅读XX万。 对技术有热情喜欢深入研究问题的本质。 以上是我的简单介绍有什么想详细了解的地方我可以展开说。自我介绍的常见错误❌ 从出生地开始介绍没人关心你哪里人 ❌ 念简历面试官看得到你的简历 ❌ 说太多无关信息爱好、性格... ❌ 超过3分钟面试官已经走神了 ❌ 太谦虚我可能不太行...二、项目相关问题占面试40%高频问题1“介绍一下你的项目”回答框架背景 → 架构 → 你做了什么 → 技术亮点 → 结果高频问题2“项目中遇到最大的挑战是什么”核心思路不要说学了一个新框架要说一个真实的技术难题。示例回答 我遇到的最大挑战是解决高并发下的库存超卖问题。 最初我用MySQL的行锁来保证一致性但压测发现在1000并发时 大量请求等待锁释放接口延迟飙到5秒以上。 后来我尝试了两个方案 方案A数据库乐观锁UPDATE ... WHERE stock 0 - 优点实现简单 - 缺点高并发下大量update失败需要重试浪费数据库资源 方案BRedis预扣库存Lua脚本原子操作 - 优点Redis性能高单机10万QPS轻松扛住 - 缺点需要保证Redis和MySQL最终一致 最终我选了方案B通过RocketMQ异步将Redis中的预扣结果同步到MySQL。 加了一个定时对账任务兜底确保最终一致性。 优化后压测结果1万并发下接口P99为80ms零超卖。高频问题3“为什么选这个技术方案”核心思路展示你有对比思考不是因为教程用的这个。回答模板 我对比了X和Y两个方案 - X方案的优点是...缺点是... - Y方案的优点是...缺点是... - 结合我们的场景[具体描述]Y方案更合适因为...高频问题4“如果流量扩大10倍你的系统该怎么改”回答框架由近及远 1. 应用层水平扩容加机器、K8s HPA 2. 缓存层Redis集群分片扩容 3. 数据库读写分离 → 分库分表 4. 消息队列增加分区/Topic扩容 5. 架构服务拆分 → 独立部署 → 独立扩展 6. 终极方案CDN 本地缓存 多活架构三、计算机基础高频问题操作系统篇Q1: 进程和线程的区别 → 资源分配的最小单位 vs CPU调度的最小单位 → 进程有独立地址空间线程共享进程的地址空间 → 进程间通信代价高管道、消息队列、共享内存 线程间通信简单共享内存但需要同步 Q2: 死锁的条件和解决 → 四个必要条件互斥、持有并等待、不可剥夺、循环等待 → 破坏任意一个条件即可避免 → 实际开发中按固定顺序加锁、设置超时时间 Q3: 虚拟内存和页面置换 → 让程序以为自己拥有连续的完整内存 → 实际上只把活跃的页放在物理内存中 → LRU是最常用的置换算法 → 实际面试追问到Linux的页缓存概率不大但要知道 Q4: 用户态和内核态什么时候切换 → 用户态运行用户程序 → 内核态执行系统调用文件IO、网络、进程管理 → 切换开销保存/恢复寄存器、TLB失效 → 尽量减少系统调用次数batch操作计算机网络篇Q1: TCP三次握手为什么不是两次 → 三次握手SYN → SYNACK → ACK → 两次不行的原因如果客户端一个过时的SYN到达服务端 服务端回了SYNACK就认为连接建立了但客户端已经不要这个连接了 → 第三次ACK让服务端确认客户端确实还想建立连接 Q2: TCP四次挥手TIME_WAIT的作用 → 确保最后一个ACK能到达对方如果丢了对方会重发FIN → 让本连接的数据包在网络中消亡2MSL时间 → 避免新连接收到旧连接的数据 Q3: TCP和UDP的区别各自适用场景 → TCP可靠、有序、面向连接HTTP、RPC → UDP快速、无连接、不保证到达视频/游戏/DNS Q4: HTTP和HTTPS的区别 → HTTPS HTTP TLS加密 → TLS握手过程非对称加密协商密钥 → 对称加密传输数据 → 性能开销多了1-2个RTTTLS握手 Q5: 在浏览器输入URL后发生了什么 → DNS解析 → TCP连接 → TLS握手(如果HTTPS) → HTTP请求 → 服务端处理 → HTTP响应 → 浏览器渲染 这个问题要能讲5分钟每一步都可以展开四、Java核心高频问题Java基础Q1: HashMap的原理 → 数组链表红黑树JDK8 → 默认容量16负载因子0.75 → 链表8转红黑树6退化回链表 → 扩容2倍扩容rehash → 追问线程不安全扩容时死循环、数据覆盖 → 追问ConcurrentHashMap怎么解决分段锁→CASsynchronized Q2: String、StringBuilder、StringBuffer → String不可变final char[]线程安全 → StringBuilder可变线程不安全性能好 → StringBuffer可变synchronized同步线程安全 → 99%场景用StringBuilder Q3: 和 equals → 比较引用地址 → equals比较值需要重写 → Integer缓存池-128~127用返回trueJVM篇Q1: JVM内存区域 → 堆对象实例、方法区类信息/常量池、栈局部变量/方法调用 程序计数器、本地方法栈 → 堆分为新生代Eden S0 S1和老年代 Q2: 垃圾回收算法 → 标记-清除简单但有碎片 → 标记-整理无碎片但慢 → 复制算法无碎片、快但空间利用率低新生代用这个 → 分代收集新生代用复制、老年代用标记-整理 Q3: CMS和G1的区别 → CMS低延迟为目标老年代并发标记清除 → G1可预测停顿时间Region化内存管理 → CMS有碎片问题concurrent mode failure → Full GC → G1是JDK9默认收集器 Q4: 如何排查线上OOM → 1. jmap -heap查看堆使用情况 → 2. jmap -dump导出堆转储 → 3. MAT分析大对象和引用链 → 4. 常见原因内存泄漏集合只进不出、大对象、数据库查询返回太多五、中间件高频问题RedisQ1: Redis为什么这么快 → 内存操作、单线程无锁竞争、IO多路复用、高效数据结构 Q2: 缓存穿透/击穿/雪崩 → 穿透查不存在的数据 → 布隆过滤器/缓存空值 → 击穿热点key过期 → 互斥锁/逻辑过期 → 雪崩大量key同时过期 → 随机过期时间/多级缓存 Q3: Redis持久化 → RDB快照恢复快但可能丢数据 → AOF追加日志数据更安全但文件大 → 混合持久化RDB做全量 AOF做增量推荐MySQLQ1: 索引的数据结构 → B树叶子节点有序链表范围查询友好 → 为什么不用B树B树叶子节点形成链表适合范围查询 → 为什么不用HashHash不支持范围查询和排序 Q2: 事务隔离级别 → 读未提交、读已提交(RC)、可重复读(RR)、串行化 → MySQL默认RR通过MVCC实现 → RR下通过间隙锁解决幻读 Q3: MVCC原理 → 每行记录有隐藏列trx_id, roll_pointer → undo log版本链 → ReadView决定可见性 → RC每次SELECT生成新ReadViewRR只在第一次SELECT生成消息队列Q1: 消息丢失怎么办 → 生产者同步发送 重试 → Broker持久化同步刷盘 → 消费者手动ACK处理完再确认 Q2: 重复消费怎么办 → 消费端做幂等 → 方案唯一ID去重表、状态机、数据库唯一索引 Q3: 消息顺序怎么保证 → 全局顺序单分区牺牲性能 → 局部顺序相同业务key路由到同一分区六、系统设计题高频题1“设计一个短链系统”回答框架 1. 需求分析 - 读多写少100:1 - 短链长度要求6-8位 - 过期时间 2. 核心设计 - 生成算法哈希MurmurHash Base62编码 - 冲突解决布隆过滤器 数据库唯一索引 - 存储MySQL长链→短链映射 Redis缓存 3. 高并发优化 - 读CDN 本地缓存 Redis MySQL - 写ID预生成器提前生成短码池 4. 扩展考虑 - 自定义短链 - 访问统计 - 过期清理高频题2“设计一个秒杀系统”核心回答 1. 前端静态化 CDN 按钮防抖 验证码 2. 网关限流漏桶/令牌桶 黑名单 3. 应用层Redis预扣库存Lua原子操作 4. 消息层MQ异步创建订单 5. 数据层MySQL最终落库 关键点 - 层层过滤每层砍掉90%的请求 - 能在前面挡住的绝不放到后面七、行为面试题“你最大的优点/缺点是什么”优点和岗位相关 我的优点是遇到问题喜欢深挖本质。比如之前项目里一个接口慢 我不只是加了个缓存就完事而是完整地分析了慢在哪、为什么慢、 有几种解决方案、各自trade-off是什么。最后不仅解决了问题 还总结成了一篇博客分享给团队。 缺点真实但不致命正在改进 我的缺点是有时候追求完美会影响效率。比如写代码会花时间 在命名和架构设计上可能会延迟交付。 我正在改进的方法是先快速出MVP再迭代优化。“你有什么想问我的吗”好问题展示你对团队/技术的兴趣 1. 团队目前在做的最大挑战是什么 2. 新人前三个月一般会做什么类型的任务 3. 团队的技术选型是怎么决定的有没有技术分享的文化 4. 您觉得在这个团队做得好的人有什么共同特质八、面试后的复盘模板每场面试后立刻记录## 面试复盘 - XX公司 - 第X面 ### 基本信息 - 日期2024-xx-xx - 岗位Java后端实习 - 面试官xx级别 - 时长45分钟 ### 问到的问题 1. [问题1] - 我的回答xxx - 回答得好/不好xxx - 正确/更好的答案xxx 2. [问题2] ... ### 总结 - 表现好的地方 - 需要改进的地方 - 下次面试前要补的知识 ### 结果 - [ ] 通过 - [ ] 未通过 - [ ] 等待中九、面试的一些非技术Tips1. 面试前 - 提前10分钟到线下/ 5分钟进房间线上 - 测试好耳机、摄像头、网络 - 准备好纸笔手撕代码可能要画图 2. 面试中 - 不会的问题说我不确定但我的理解是... - 手撕代码先说思路面试官确认后再写 - 遇到提示不要抵触顺着提示走 3. 面试后 - 当天做复盘 - 不会的题马上查、马上补 - 不要在社交媒体上抱怨面试官写在最后面试就是一场信息不对称的博弈——面试官的题库是有限的你准备得越充分赢面越大。把这篇文章的高频问题逐个准备一遍你的面试通过率至少能提升50%。整理这些内容花了很多时间如果对你有帮助点赞收藏就是最大的鼓励祝大家面试顺利~