首页 > 去年后端暑期实习拿了5+个大厂offer,面试被问最多的全在这了
头像
托马斯杨儿
发布于 04-04 17:33 上海
+ 关注

去年后端暑期实习拿了5+个大厂offer,面试被问最多的全在这了

全文约 4400 字 | 预计阅读 11 分钟

目录

  1. 先交个底:我是谁,拿了什么结果
  2. 45 场面试,被问最多的后端八股全在这了
  3. 手撕题:写不出来基本就挂了
  4. 暑期实习和春招,考的真不一样
  5. 最后说两句

上一篇春招五周,我面了四十多场,最后想说的全在这了发出来之后,反馈比我预想的好很多。很多同学私信问我:暑期实习也有这种汇总吗?

刚好清明假期有空,把去年暑期实习的面经全部翻出来整理了一遍。43 篇精修面经,每一篇我都重新读了,把所有被问到的问题按频率和重要性做了归类。

先说一句:这是去年的面经,时效性肯定不如今年的新鲜。但八股文和算法题这东西,一年前和一年后差别不大,核心考点就那些。我两篇文章加起来不到 100 道八股题,如果你能把这些真正吃透,基础面基本不会翻车。拿着这些题目去问 AI,让它给你讲原理、出追问,效率比自己漫无目的刷帖子高很多。

不过说实话,现在 AI 时代,八股的考察权重正在下降。面试官越来越清楚,背八股谁都会,AI 搜一下就有标准答案。真正拉开差距的是项目。而项目的重点不在于你具体怎么实现的——AI 可以把「怎么做」做得很好——重点在于你为什么这样选型。为什么用 Redis 不用本地缓存?为什么选 RabbitMQ 不选 Kafka?为什么异步化要从线程池换成消息队列?面试官考的是你的判断力和 review 能力,不是你的背诵能力。

所以这篇八股汇总,与其说是让你背答案,不如说是帮你建立一个检查清单:这些知识点你能不能用自己的话讲清楚「为什么」

四月是暑期实习拿 offer 的黄金时间。如果你是 27 届找后端开发实习的同学,这篇应该能帮你省不少时间。

0. 先交个底:我是谁,拿了什么结果

先说起点。

本科同济软件,保研到浙大软件。暑期实习投递的时候,手上有两段实习经历:一段是在某车企做技术助理;另一段是在某外企做 QA,说实话实习和后端匹配度不高。项目方面,自己跟着“鱼皮”做了一个高性能 Java RPC 框架,还跟着某马课程做了xx 外卖的后端。

再说终点。

从 2 月 8 号开始投递,2 月 13 号第一场面试,一直面到 4 月 8 号,整整两个月。38 家公司投递,45 场面试,6 家简历挂,最终拿到 7 个大厂offer。

offer 来自:淘天、阿里云、腾讯、bilibili、饿了么、美团、拼多多

中间被拒了不少,有 9 家面试挂了,还有 5 家投完一个月没任何消息。

上一篇春招的数据是 36 家、40+ 场面试、5+ 个 offer。两次加起来,我这一年多面了将近 90 场,后端八股基本被面试官翻来覆去问了个遍。

下面就是重点了。

1. 45 场面试,被问最多的后端八股全在这了

以下所有问题都来自我去年暑期实习 43 场面试的真实记录。每个问题后面标注了被问到的次数重要性星级(⭐ 越多越重要)。不标注公司名,只看频率说话。

如果你看过我上一篇春招五周,我面了四十多场,最后想说的全在这了,可以对比着看——春招和暑期实习的考察侧重点其实挺不一样的,后面第三部分我会专门聊这个。

Java 并发编程

这是被问频率最高的一整块,几乎没有一场面试能跳过。

线程池的核心参数和原理(14 场被问)⭐⭐⭐⭐⭐

核心线程数、最大线程数、等待队列、拒绝策略——这四个参数是保留节目。常见追问:IO 密集型和 CPU 密集型分别怎么配?无界队列会导致什么问题?空闲线程怎么回收?队列满了为什么先入队而不是先扩容线程?

synchronized 的用法和锁机制(7 场被问)⭐⭐⭐⭐

三种加锁方式(方法、代码块、静态方法),静态方法加 synchronized 后类名调用和对象调用有没有竞争关系,synchronized 和 ReentrantLock 的区别。

CAS 与 ConcurrentHashMap(6 场被问)⭐⭐⭐⭐

CAS 原理、ABA 问题、ConcurrentHashMap 为什么同时用 CAS 和 synchronized、ConcurrentHashMap 和 Hashtable 的区别。

ThreadLocal 原理和内存泄漏(5 场被问)⭐⭐⭐⭐

ThreadLocal 怎么实现的、为什么 key 用弱引用 value 用强引用、内存泄漏怎么规避、配合 Redis 做登录校验的完整流程。

volatile 关键字(5 场被问)⭐⭐⭐⭐

volatile 的可见性和有序性、volatile 能不能替代锁、为什么双重校验锁里必须用 volatile、什么场景用 volatile 什么场景必须用锁。

AQS 原理(3 场被问)⭐⭐⭐

AQS 是什么、如何实现公平锁和非公平锁、ReentrantLock 底层怎么依赖 AQS。

死锁的条件与排查(3 场被问)⭐⭐⭐

死锁四个必要条件、两个人互相转账怎么产生死锁、如何用 jstack 排查死锁、怎么通过锁排序避免死锁。

多线程创建方式(3 场被问)⭐⭐⭐

Thread、Runnable、Callable、线程池,各自的区别和适用场景。

wait/sleep/notify(2 场被问)⭐⭐

wait 和 sleep 的区别、notify 和 notifyAll 的区别、为什么 wait 要在 synchronized 块里。

JVM 与垃圾回收

G1 和 CMS 垃圾回收器(5 场被问)⭐⭐⭐⭐

G1 的分区原理、STW 时间配置(200ms vs 500ms 的取舍)、为什么吞吐量大的场景可以牺牲 STW 时间、CMS 和 G1 的核心区别、大对象场景下 G1 怎么调优。

Full GC / OOM 排查(3 场被问)⭐⭐⭐

Full GC 频繁怎么排查、OOM 可能有哪些原因、CPU 占用过高怎么定位到具体线程。

JDK 内存结构(2 场被问)⭐⭐⭐

JDK8 的内存模型、堆和方法区的区别、对象内存分配流程。

双亲委派机制(2 场被问)⭐⭐

双亲委派是什么、Tomcat 为什么要破坏双亲委派、如何实现类隔离。

虚拟线程(JDK21)(2 场被问)⭐⭐

虚拟线程和平台线程的区别、协程的 m:n 映射模型。这个知识点当时算比较新,但越来越多面试官开始问了。

MySQL

索引与 B+ 树(8 场被问)⭐⭐⭐⭐⭐

联合索引的最左前缀匹配、覆盖索引和回表、B+ 树和 B 树的区别(不只是磁盘 IO)、聚簇索引和非聚簇索引、索引是不是越多越好、什么情况下有覆盖索引还会回表(MVCC 相关)。

事务、隔离级别与 MVCC(6 场被问)⭐⭐⭐⭐

四种隔离级别各自怎么实现的、MVCC 和 ReadView 的关系、RC 和 RR 的区别、事务的 ACID 分别靠什么机制保证。

分库分表(3 场被问)⭐⭐⭐

什么场景用分库分表 vs 加索引就够了、数据量几十亿即使有索引还是慢怎么解释(B+ 树层级变深)、分库分表中间件怎么实现(AOP 拦截 SQL)、没有分表键的查询怎么处理。

慢查询与深分页优化(3 场被问)⭐⭐⭐

分页查询变慢的原因、LIMIT OFFSET 的问题、游标分页(ID 记录法)、EXPLAIN 怎么分析执行计划、一个事务中有多条慢语句怎么排查。

redo log / binlog / undo log(3 场被问)⭐⭐⭐

redo log 为什么存在(为什么不直接刷盘)、redo log 和 binlog 的区别、undo log 在 Insert 和 Update 时分别记什么。

Redis

分布式锁(6 场被问)⭐⭐⭐⭐⭐

怎么实现分布式锁、可重入怎么做(Hash 结构)、超时自动释放和 Watchdog 续期、如果没有 Redis 怎么实现分布式锁、获取锁失败后怎么处理。

限流算法(令牌桶)(6 场被问)⭐⭐⭐⭐

令牌桶的底层数据结构和实现原理、滑动窗口和漏桶算法的区别、令牌桶自己实现怎么做、限流会不会有性能问题(CAS vs 锁竞争)。

缓存一致性(5 场被问)⭐⭐⭐⭐

Cache Aside 模式、先更新数据库再删缓存中间失败怎么办、为什么要删缓存不能直接更新、延迟双删、Canal 监听 binlog + MQ 重试、高并发下删缓存瞬间所有请求打到数据库怎么办。

缓存穿透、击穿、雪崩(4 场被问)⭐⭐⭐⭐

三者的区别和解决方案、布隆过滤器原理和误判率、缓存预热、多级缓存。

一致性哈希与集群(4 场被问)⭐⭐⭐

一致性哈希怎么保证数据均匀分布(虚拟节点)、Redis 集群模式扩容时数据迁移、哨兵机制、主节点通信协议。

Redis 数据结构(3 场被问)⭐⭐⭐

五大基础类型各自的使用场景、ZSet 底层实现(跳表)、Set 在数据量小和大时的不同实现。

消息队列

MQ 选型与对比(7 场被问)⭐⭐⭐⭐⭐

Kafka、RocketMQ、RabbitMQ 的核心区别、Kafka 为什么性能好(顺序写、零拷贝、分区并行)、RabbitMQ 在什么场景更合适、线程池和消息队列实现异步的区别。

消息可靠性与幂等(4 场被问)⭐⭐⭐⭐

消息丢失怎么解决、消息幂等性怎么保证、消息队列如何保证事务一致性、事务性消息的原理。

网络

TCP/UDP 及可靠传输(3 场被问)⭐⭐⭐

TCP 和 UDP 的区别与应用场景、TCP 如何保证可靠传输、拥塞控制原理、用 UDP 传文件怎么设计。

DNS 与网络全链路(3 场被问)⭐⭐⭐

域名解析过程、从输入 URL 到页面渲染的全过程、数据从网卡到进程的中间环节(中断、协议栈)。

HTTP 相关(2 场被问)⭐⭐

301 和 302 的区别、HTTP 请求方法(GET/POST/OPTIONS)、HTTPS 原理。

设计模式与 Spring

单例模式(4 场被问)⭐⭐⭐⭐

饿汉、懒汉、双重校验锁、静态内部类四种实现、单例模式的缺点、为什么 DCL 需要 volatile。

Spring 相关(3 场被问)⭐⭐⭐

Spring 容器启动流程、Spring 和 SpringBoot 的区别、Spring 拦截器。

Java 基础(别小看)

equals 与 hashCode(3 场被问)⭐⭐⭐

为什么重写 equals 必须同时重写 hashCode、自定义对象做 HashMap 的 key 要注意什么、手写一个类的 equals 和 hashCode。

集合类(4 场被问)⭐⭐⭐

HashMap 工作原理和哈希冲突、HashMap 和 LinkedHashMap 的区别、ArrayList 和 LinkedList 的区别、常用集合至少说 5 个。

面向对象(3 场被问)⭐⭐

三大特性(封装、继承、多态)、Java 实现多态的方式、反射原理和应用场景。

2. 手撕题:写不出来基本就挂了

手撕题的覆盖面比八股窄得多,但一旦写不出来基本就挂了。以下是我 43 场面试中遇到的所有手撕题。

链表

K 个一组翻转链表(2 场被问)⭐⭐⭐⭐⭐

经典高频题,考察链表操作的基本功。两场面试都是原题,没有变形。

滑动窗口

最长不含重复字符的子串(2 场被问)⭐⭐⭐⭐

标准滑动窗口模板题,写熟了 5 分钟搞定。

场景设计题

文本编辑器(支持撤销/重做)(2 场被问)⭐⭐⭐⭐

不是纯算法,考的是数据结构设计能力。需要用双栈实现 undo/redo,还要按文件路径分组管理。

设计 Insert/Remove/GetRandom 均为 O(1) 的数据结构(1 场被问)⭐⭐⭐⭐

ArrayList + HashMap 的经典组合,考察对数据结构底层的理解。

两个栈实现最大栈(获取最大值 O(1))(1 场被问)⭐⭐⭐

辅助栈的经典应用。追问:只用一个栈怎么做?

动态规划

股票买卖最佳时机系列(1 场被问,但一次考了三道变形)⭐⭐⭐⭐

无限次交易(贪心)、一次交易(前缀最小值)、两次交易(前后缀分解)。一次面试连环考了三道,杀伤力极大。

编辑距离(1 场被问)⭐⭐⭐

经典二维 DP,必须熟练。

爬楼梯(1 场被问)⭐⭐

送分题,但面试紧张的时候也可能翻车。

回溯

复原 IP 地址(1 场被问)⭐⭐⭐

回溯 + 剪枝,注意前导零和数值范围。

子集(1 场被问)⭐⭐⭐

回溯模板题。

生成变位词(全排列变形)(1 场被问)⭐⭐⭐

回溯生成所有排列,注意去重。

排序与查找

第 K 小元素(快排 partition)(1 场被问)⭐⭐⭐

快速选择算法,追问堆排和桶排的适用场景。

m 行有序数组求交集(1 场被问)⭐⭐⭐

多指针 + 记录最大值。面试官还追问了堆的方案是不是真的更快。

其他

字符串转整数(atoi)(1 场被问)⭐⭐⭐

处理正负号、前导空格、溢出边界,细节题。

优惠券按比例分摊(整数约束)(1 场被问)⭐⭐⭐

按比例分配后余数怎么处理,贪心排序。

手写 equals 和 hashCode(1 场被问)⭐⭐

考察代码基本功,注意空指针处理。

二叉树求总和 / Top3 节点(1 场被问)⭐⭐

递归遍历 + 排序或最小堆。

HTTP/WebSocket 服务端客户端实现(1 场被问)⭐⭐⭐

考察网络编程实战能力,包括异步发送多个请求和长连接定时推送。

手写数据结构(按 ID 管理列表,支持头部插入和删除)(1 场被问)⭐⭐

HashMap + LinkedList 的组合。

3. 暑期实习和春招,考的真不一样

我去年暑期实习面了 45 场,今年春招面了 40 多场。两轮下来,感受还是挺不一样的。

第一,暑期实习更看基础,春招更看项目深度。

暑期实习的面试,八股文占比明显更高。很多一面甚至二面,大部分时间都在问 Java 并发、MySQL 索引、Redis 缓存这些基础知识。面试官的态度是:你是实习生,我不指望你做过多复杂的系统,但基础得扎实。

春招就不一样了。面试官默认你有实习经历,会直接追着项目细节问:你为什么做这个选择、遇到问题怎么解决的、如果重新设计你会怎么改。八股还是会问,但比例明显下降。

第二,暑期实习的手撕题更标准,春招也差不多。

暑期实习的算法题大多是 LeetCode 原题或者微调版,准备起来有章可循。搞定 hot100 基本绰绰有余,其他就是看算法积淀了。

第三,暑期实习战线更长。

我今年春招的投递集中在二三月,黄金期大概就一个月。暑期实习的战线更长,从二月底到五月初都有机会。大家抓紧把我清明节后的一个月努力上岸。

第四,HR 面的画风不太一样。

暑期实习的 HR 面比较轻松,主要确认实习时间、工作意向、基本情况。春招的 HR 面会深入很多,问职业规划、问你怎么看加班文化、问你在多个 offer 之间怎么选,甚至会问家庭情况。

给找暑期实习的同学几条建议:

八股文一定要系统过一遍。 你看我上面的高频题,Java 并发、MySQL、Redis 这三块加起来覆盖了 80% 以上的面试。不需要每个知识点都能写论文,但线程池参数、索引原理、分布式锁这些必须能讲清楚。

手撕题每天保持手感。 不用刷很多,每天 1-2 道,重点把链表、滑动窗口、动态规划、回溯这几个类型刷熟。面试的时候能在 15 分钟内写出来就够了。

每场面试写复盘。 这是我做得最正确的一件事。43 篇面经我都会抽空整理复盘。当时觉得麻烦,现在回头看,这些复盘就是我最宝贵的资产。

四月是黄金窗口,别等了。 如果你还没开始投,清明节后赶紧动起来。大厂的暑期实习岗位通常四月中下旬就开始收口了,不要等到五月才急。

4. 最后说两句

整理这篇花了不少时间。43 篇面经,每一篇都重新读了,把问题一个个提出来分类、统计频率、标注重要性。

说实话,去年面暑期实习的时候,我也是一边面一边学。很多问题第一次被问到的时候答不上来,回去查资料、写复盘,下一场就能答了。所以不用怕被问倒,重要的是每次面试都有收获。

最后,原创高密度的面经整理确实不容易,如果觉得有帮助,希望能转发给同样在准备暑期实习的同学。

全部评论

(2) 回帖
加载中...
话题 回帖