后端开发面试高频题 Top 25:真实面试热度榜(2026 年 8 月版)
基于后端开发岗近 90 天的真实面试记录整理:这个周期实际被高频问到的 25 道题,标注热度等级和近期实际出题的知名公司,附答题框架解析。
这是这份榜单的第二期。上一期发在 7 月中旬,这次重新跑了一遍近 90 天的窗口,题目排序会跟着实际出题情况变,不是把上期原样搬过来。
跟上一期不太一样的地方:这个周期里没有出现单题被问到「遥遥领先」的程度,热度整体更分散——排第一的慢 SQL 排查题依然稳,但往后大部分题目都落在中等热度区间,说明面试官问的面更广了,不是只盯着几道必考题反复考。
怎么用这份榜单:
- 热度标注(🔥/⭐/常规)只反映这道题在近 90 天、后端开发岗里的相对出题频率,跨岗位、跨周期不能直接比
- 公司名单是近期实际出过这道题、且能公开确认的知名公司,不代表完整名单,也不代表只有这几家在问
- 解析给的是答题框架和常见追问方向,不是标准答案——照着背,面试官换个问法就容易露馅
Redis 与缓存
1. Redis 分布式锁如何实现?
⭐ 较高频 · 字节跳动 等大厂近期有考
基础实现是 SET key value NX PX 一条命令原子加锁,value 放一个唯一标识(UUID 或线程标记),释放锁时先用 Lua 脚本校验 value 再删——避免 GET+DEL 两步拆开后锁被误删。
这题的分水岭在于面试官会不会往下追:锁的有效期设短了、业务还没跑完怎么办(Redisson 用看门狗线程自动续期)、主从切换瞬间锁会不会丢(异步复制下,主库刚加完锁还没同步到从库就宕机,新主库上锁是空的;RedLock 是社区给出的应对方案之一,但工程上争议不小,能聊出争议点比背答案加分)、要不要支持可重入(用 ThreadLocal + 计数器,或者直接用 Redisson 现成的可重入锁)。回答的时候把「加锁 → 续期 → 释放 → 异常兜底」这条链串起来讲,比背命令本身更值钱。
2. 缓存穿透、缓存击穿、缓存雪崩分别是什么?如何解决?
常规考点 · 字节跳动、阿里巴巴 等大厂近期有考
三个概念容易背混,区分点在「请求最终打到哪、为什么打过去」:穿透查的是数据库里压根不存在的数据,缓存永远 miss,请求直接穿过去打库(布隆过滤器提前拦截、或者把空结果也缓存一小段时间);击穿是某个访问量很大的热点 key 恰好在这一刻过期,大量并发请求同时回源重建(互斥锁只放一个请求去重建、其余等结果,或者干脆让热点 key 逻辑过期、不做物理删除);雪崩是大批 key 同时失效或者 Redis 整体挂了,瞬间流量全部压向数据库(过期时间加随机扰动、搭建多级缓存、数据库前面挂限流和熔断兜底)。
答完定义别停,补一句自己项目里实际踩过哪种、用了什么方案——这题面试官大概率会顺着问「你们线上出现过雪崩吗,当时怎么处理的」。
MySQL
3. 慢 SQL 怎么排查和优化?
🔥 高频考点 · 字节跳动、快手、百度、京东 等大厂近期都在考
这题考的是一条完整的排查链路,不是零散的优化技巧堆砌:先靠慢查询日志或 APM 监控定位到具体 SQL,再用 EXPLAIN 看执行计划——重点看 type(有没有退化成全表扫描)、key(走没走预期的索引)、rows(扫描行数是不是明显偏大)、Extra(有没有出现 Using filesort / Using temporary,这两个通常意味着排序或分组没吃到索引)。定位到问题后再对症下药:加索引或者调整联合索引的列顺序、SQL 改写(避免在索引列上包函数、避免隐式类型转换)、用覆盖索引减少回表、深分页改成游标分页、超大查询拆成多次小查询。
面试官几乎一定会追问「你真排查过的一次慢 SQL 是什么样的」——没有现成案例的话,提前准备一个,带上具体的优化前后耗时(比如从 2s 降到 80ms),比空讲优化手段有说服力得多。
4. 索引在什么情况下会失效?
⭐ 较高频 · 快手、滴滴、京东 等大厂近期有考
高频失效场景可以按「破坏了索引的有序性/连续性」这条主线记:违反最左前缀(联合索引跳过前面的列直接用后面的列查)、对索引列做了函数运算或者隐式类型转换(字符串列传数字进去)、前导模糊匹配 LIKE '%xx'(无法利用 B+ 树的有序性定位)、OR 连接了没有索引的列、以及优化器自己判断走索引不如全表扫描划算(区分度太低,比如性别字段)。
联合索引的最左前缀原则经常被单独拎出来问:索引按定义顺序组织成一棵树,查询条件必须从最左列开始连续匹配,一旦中间断掉或者用了范围查询,后面的列就不能再走索引精确定位了。回答的时候带一句「拿不准就上 EXPLAIN 验证,不靠猜」,工程味立刻就出来了。
5. MySQL 事务隔离级别有哪些?
常规考点 · 京东、字节跳动、滴滴 等大厂近期有考
读未提交、读已提交、可重复读、串行化,级别越高解决的并发问题越多(依次解决脏读、不可重复读、幻读),代价是锁开销和并发度的权衡。InnoDB 默认可重复读。
高分答法要往下钻一层:可重复读靠 MVCC(undo log 构建的 ReadView)实现快照读,普通查询不需要加锁;但快照读能防住的幻读,在当前读(SELECT ... FOR UPDATE 这类)下还得靠间隙锁配合行锁才能防住。「MySQL 的可重复读到底防不防幻读」是这题最常见的追问陷阱,提前把快照读和当前读的区别想清楚再进面试。
6. MySQL 的索引结构是什么?为什么用 B+ 树而不是 B 树或哈希表?
常规考点 · 字节跳动、腾讯 等大厂近期有考
InnoDB 用 B+ 树组织索引:非叶子节点只存 key 不存数据,同样一个磁盘页能塞下更多索引项,树的层数就更矮,一次查询需要的磁盘 IO 更少;叶子节点之间用指针串成有序链表,范围查询和排序直接顺着链表扫就行,不用回头做中序遍历。
对比着讲会更清楚:B 树的数据分散在所有节点上,做范围查询要在树里跳来跳去;哈希索引等值查询是 O(1),但没有顺序,范围查询和排序完全用不上。延伸考点是聚簇索引和二级索引的区别、什么是回表、什么是覆盖索引——这几个词主动带出来,面试官往往就顺着往下问,比等他来问更主动。
7. 事务四大特性 ACID 是什么?
常规考点 · 字节跳动、腾讯 等大厂近期有考
原子性、一致性、隔离性、持久性,各自一句话定义只是入场券。这题跟「隔离级别」的区分点在于面试官想听的是实现机制:原子性靠 undo log(回滚时按日志反向操作),持久性靠 redo log(提交时先写日志再落盘,掉电后靠日志恢复),隔离性靠锁加 MVCC 一起保证。
一致性容易被答漏——它不是独立实现出来的,而是前三者共同作用的结果(业务规则 + 原子性 + 隔离性一起保证数据从一个合法状态转移到另一个合法状态)。能说清楚这层从属关系,比背四个名词定义更能体现理解深度。
8. InnoDB 和 MyISAM 有什么区别?
常规考点 · 多家企业近期有考
核心区别集中在四点:InnoDB 支持事务(靠 undo/redo log)、行级锁(并发写更友好)、崩溃后能自动恢复、索引和数据存在一起(聚簇索引);MyISAM 不支持事务、只有表级锁、索引和数据分开存、没有崩溃恢复机制,但因为结构简单,纯读场景和批量插入有时会更快。
现在建表默认都是 InnoDB,这题问的其实不是「选哪个」,而是「你知不知道为什么」。答到崩溃恢复和锁粒度这两点基本就到位了,能再补一句「MyISAM 现在主要还在一些老系统里能见到」会显得更贴近实际。
Java 基础与集合
9. Java 中 equals 和 == 有什么区别?
⭐ 较高频 · 得物 等大厂近期有考
== 对基本类型比较的是值本身,对引用类型比较的是内存地址;equals 是 Object 的方法,默认实现其实也是比地址,但很多类(比如 String)重写成了「业务意义上相等」。
必须带上的一句是重写 equals 时要同步重写 hashCode,否则对象放进 HashMap/HashSet 后会出现「明明相等却查不到」的怪现象(因为哈希桶定位靠 hashCode,桶内比较才用 equals)。再准备一个 Integer 缓存池的陷阱:-128~127 范围内的 Integer 用 == 比较是 true,超出这个范围就是 false——这是个经典追问,出现率很高。
10. StringBuffer 和 StringBuilder 有什么区别?
常规考点 · 多家企业近期有考
StringBuffer 的方法都加了 synchronized,线程安全但有同步开销;StringBuilder 不做同步,单线程场景下更快。实际项目里几乎都用 StringBuilder——多线程下拼字符串的常见做法是各线程先各自拼完,最后再合并结果,而不是共享一个 StringBuffer 去抢锁。
顺手带一句 String 的不可变性会加分:编译器对 + 拼接做了优化(简单场景等价于用了 StringBuilder),但循环体内用 + 拼接会在每次循环都新建一个 StringBuilder,这才是「循环里用 + 拼字符串很慢」的真正原因。
11. Java 基本类型有哪些?
常规考点 · 多家企业近期有考
8 种:byte、short、int、long、float、double、char、boolean,分别对应不同的存储大小和取值范围。它们不是对象,存在栈上(局部变量场景),没有方法可调用。
这题看着基础,追问通常落在装箱拆箱上:为什么集合(比如 List<Integer>)不能直接存基本类型、必须用包装类,以及自动装箱在循环里频繁触发时对性能和内存的影响(每次装箱都可能新建对象,命中缓存池范围内除外)。
12. ArrayList 和 LinkedList 有什么区别?
常规考点 · 多家企业近期有考
底层结构不同:ArrayList 是动态数组,随机访问 O(1),但中间插入删除要挪动后面的元素;LinkedList 是双向链表,插入删除本身是 O(1),但前提是已经定位到目标节点,而定位这一步是 O(n)。
诚实一点回答会更有说服力:绝大多数场景下 ArrayList 都更快,因为 LinkedList 节点在内存里不连续,对 CPU 缓存不友好,「插删 O(1)」的优势经常被定位开销和缓存缺失抵消掉。「你什么时候会真的用 LinkedList」的老实答案是几乎不用(除非是明确需要频繁在头尾插删的队列场景),这个反直觉的结论面试官通常会追着问下去。
13. HashMap 和 ConcurrentHashMap 有什么区别?
常规考点 · 快手、腾讯 等大厂近期有考
HashMap 不是线程安全的,并发 put 在旧版本(1.7 头插法)下可能死循环,现在的尾插法虽然不会成环但依然会丢数据;ConcurrentHashMap 在 1.8 之后放弃了 1.7 的分段锁(Segment),改成对每个桶头节点用 CAS + synchronized,锁粒度更细、并发度更高。
追问基本会问到「1.8 为什么放弃分段锁」(分段锁粒度太粗,锁的桶数固定且不能扩容;桶级别的 CAS/synchronized 能随着 table 扩容天然变细)和「size() 为什么不精确」(并发场景下统计过程中数据还在变,只能做近似估算)。
Java 并发与虚拟机
14. synchronized 和 ReentrantLock 有什么区别?什么场景下用哪个?
常规考点 · 京东、得物 等大厂近期有考
synchronized 是 JVM 内置的隐式锁:写法简单、自动释放、不会忘 unlock,1.6 之后引入了偏向锁/轻量级锁的升级路径来优化无竞争场景。ReentrantLock 是 java.util.concurrent 里的显式锁:支持公平锁、可中断、tryLock 限时等待、多个 Condition 精准唤醒不同等待队列,但代价是必须在 finally 里手动释放。
选择逻辑一句话说完:没有特殊需求就用 synchronized,需要「可中断/限时/公平/多条件队列」这些高级能力才上 ReentrantLock。有余力的话把 AQS 的骨架讲一讲——内部一个 state 变量表示锁状态,抢不到锁的线程排进一个 CLH 队列等待。
15. JVM 内存结构及各部分作用是什么?
常规考点 · 字节跳动、快手 等大厂近期有考
运行时数据区按「是否线程私有」分两类:线程私有的有虚拟机栈(存栈帧,每次方法调用对应一帧)、本地方法栈(给 native 方法用)、程序计数器(记录当前线程执行到哪条字节码);线程共享的有堆(存对象实例,GC 的主战场)和方法区/元空间(存类元数据、常量池、静态变量,1.8 后从永久代迁到了元空间,用的是本地内存而不是堆)。
这题经常是引子,后面接着问的是堆里的分代模型(新生代/老年代)和某种垃圾回收器的工作方式,提前想好从哪个 GC 器切入比较熟。
16. Java 创建线程有哪些方式?
常规考点 · 多家企业近期有考
常见的有继承 Thread、实现 Runnable、实现 Callable 配合 FutureTask(能拿到返回值和异常),以及通过线程池提交任务。前三种本质上都是「定义任务怎么跑」,线程池才是「谁来跑、跑多少个」。
回答完列举,主动补一句「实际工程里几乎不会直接 new Thread()」——直接创建线程缺乏统一管理,容易失控(线程数不可控、没有复用、异常处理不统一),生产代码基本都走线程池。这句话往往能直接把话题带到下一题。
17. 线程池核心参数如何设置,依据是什么?
常规考点 · 京东、得物 等大厂近期有考
ThreadPoolExecutor 的核心参数是:核心线程数、最大线程数、空闲线程存活时间、任务队列、拒绝策略。设置依据要分任务类型讲:CPU 密集型任务,核心线程数接近 CPU 核心数(避免过多线程切换开销);IO 密集型任务,核心线程数可以设得更大(线程在等 IO 时不占 CPU,可以适当超配)。
拒绝策略是常被忽略的加分点:默认的 AbortPolicy 会直接抛异常,生产环境更常见的做法是自定义策略把溢出任务记日志或者降级处理,而不是让异常直接把请求打挂。队列选型也值得提一句:无界队列(比如 LinkedBlockingQueue 不设容量)看着省心,实际上会让最大线程数形同虚设,任务堆积到内存打满才暴露问题。
18. 进程、线程和协程有什么区别?
常规考点 · 京东 等大厂近期有考
进程是操作系统分配资源的基本单位,进程间地址空间相互隔离,切换代价最大;线程是 CPU 调度的基本单位,同一进程内的线程共享地址空间,切换代价比进程小但仍然要经过内核态;协程是用户态的轻量执行单元,由程序自己(或语言运行时)调度,切换不需要陷入内核,代价比线程小一个量级。
Java 生态这两年被反复问到的延伸点是虚拟线程(Project Loom,JDK 21 正式发布)——它本质是运行时调度的轻量线程,能用同步写法跑出接近协程的并发吞吐,适合 IO 密集型场景。提前了解一下虚拟线程和传统平台线程的关系,能在这题上明显加分。
Spring 框架
19. @Transactional 注解在哪些场景会失效,如何解决?
常规考点 · 得物 等大厂近期有考
所有失效场景都指向同一个根因:@Transactional 靠动态代理生效,凡是绕开代理对象的调用都会失效。具体表现:同一个类里方法内部互相调用(this.xxx() 没走代理,直接跳过了事务逻辑)、方法不是 public(代理生成规则不覆盖非 public 方法)、异常被自己 catch 住没有往外抛(事务管理器压根不知道出过异常)、默认只回滚运行时异常(受检异常需要显式配置 rollbackFor)、方法所在的类没有交给 Spring 管理。
解法都对应着场景来:内部调用改成注入自己的代理对象,或者把这部分逻辑拆到另一个 Bean 里;受检异常场景加 rollbackFor = Exception.class;确认类和方法的可见性符合要求。这题本质在考「你理不理解 Spring AOP 的代理机制」,答案落回代理原理就对了。
20. Spring IoC 和 AOP 分别是什么?
常规考点 · 字节跳动 等大厂近期有考
IoC(控制反转):对象的创建和依赖装配交给容器,代码从「主动 new」变成「声明我需要什么,容器负责给我」,好处是解耦、方便测试时替换依赖。AOP(面向切面):把日志、事务、权限校验这类横切逻辑从业务代码里抽出来,通过动态代理在方法调用前后织入。
两个都别停在定义层面:IoC 补一句 Bean 的生命周期(实例化 → 属性填充 → 初始化回调 → 使用 → 销毁),AOP 补一句 JDK 动态代理(目标类实现了接口时用)和 CGLIB(没有接口时用子类化)怎么选。@Transactional 失效的那几种场景本质上就是从 AOP 代理机制推出来的,两题能连起来讲印象分会更高。
21. Spring Boot 自动装配原理是什么?
常规考点 · 多家企业近期有考
一条主线讲完:启动类上的 @SpringBootApplication 组合了 @EnableAutoConfiguration → AutoConfigurationImportSelector 读取 META-INF/spring/...AutoConfiguration.imports(较早版本读的是 spring.factories)拿到候选配置类列表 → 每个配置类上的 @ConditionalOnClass/@ConditionalOnMissingBean/@ConditionalOnProperty 逐个校验条件 → 满足条件的配置类才真正生效、注册对应的 Bean。
一句话概括本质:约定大于配置,classpath 里有什么就自动配什么,你自己显式定义了同类型的 Bean 就优先用你的。追问方向经常是「自己写一个 starter 大概要做什么」——把这条链反着走一遍:定义自动配置类、写好条件注解、在 AutoConfiguration.imports 里注册。
网络基础
22. TCP 和 UDP 有什么区别?
⭐ 较高频 · 京东、百度、腾讯 等大厂近期有考
核心对比是一组组来的:面向连接 vs 无连接、可靠传输(确认重传、流量控制、拥塞控制)vs 不保证到达、字节流 vs 数据报、头部开销大 vs 开销小。背完对比表别停,落到选型判断上:什么场景选 UDP(实时音视频、DNS 查询、游戏同步——丢一帧无所谓,但延迟必须低);怎么在 UDP 基础上做出可靠传输(QUIC、KCP 这类思路是在应用层自己实现确认和重传,绕开 TCP 内核层面的拥塞控制策略,换取更灵活的控制权)。
后端岗位问这题,很多时候是在为「HTTP/3 为什么改用基于 UDP 的 QUIC」做铺垫——提前想好这层关联,追问上不会措手不及。
23. TCP 三次握手过程是什么?
常规考点 · 百度 等大厂近期有考
SYN → SYN+ACK → ACK,把每一步双方的连接状态变化(SYN_SENT / SYN_RCVD / ESTABLISHED)带上会显得更专业。必备追问是「为什么是三次不是两次」:如果只握两次,一个滞留在网络里的旧 SYN 会让服务端误以为要建立新连接(服务端单方面进入连接状态,但客户端根本没发起过这次请求),而且两次握手服务端也没法确认自己的发送能力是正常的。
四次挥手和 TIME_WAIT 为什么要等 2MSL,大概率会连着追问,建议一起准备:等待 2MSL 是为了保证最后一个 ACK 如果丢失,对方重发的 FIN 还能在这个窗口内被正确处理。
设计与新技术
24. 面向对象三大特征是什么?
常规考点 · 多家企业近期有考
封装、继承、多态。封装是隐藏对象内部的实现细节,只暴露必要的接口;继承是复用和扩展父类的能力,减少重复代码;多态是同一个接口调用,在不同的具体实现上表现出不同行为(编译时看的是声明类型,运行时实际执行的是对象的真实类型的方法)。
这题看着送分,容易在举例环节露怯——准备一个自己代码里真实用到多态的例子(比如策略模式按不同类型分发处理逻辑),比背三个名词定义更能说明你不是背的。
25. RAG 的基本流程是什么?
常规考点 · 字节跳动 等大厂近期有考
标准链路:文档先做分片(chunking,要兼顾语义完整性和 Embedding 模型的输入长度限制)→ 用 Embedding 模型把每个分片转成向量,连同原文一起存进向量数据库 → 用户提问时,把问题也转成向量,做相似度检索召回一批候选片段 → 用更精细的模型(比如 Cross-Encoder)对候选片段做重排,把最相关的排到前面、截取 Top N → 把这些片段拼进 prompt 上下文,交给大模型生成最终答案。
这题会在后端岗出现,说明「懂不懂 AI 应用层的基本架子」正在从算法岗的专属考点,往通用后端岗渗透。追问常见方向:分块策略怎么选(固定长度 vs 按语义/标题层级切分)、检索召回不准怎么优化(混合检索——向量检索配合关键词检索、调整召回数量再重排)、怎么评估 RAG 系统的效果(评估检索命中率和生成答案的忠实度是两件事,别混着答)。
榜单之外:几条趋势观察
这个周期的题目分布比上一期更「铺开」——上一期有好几道题的热度明显甩开其他题,这次除了慢 SQL 排查,大部分题目都落在中等热度区间,说明面试官考察的知识面在变宽,不是死磕几道必考题。
RAG 相关的题第一次进入后端岗的高频榜。过去这类题基本只出现在算法或 AI 应用岗,现在后端面试官也会问基本的检索增强生成流程,说明「知道 AI 应用是怎么搭出来的」正在变成通用后端能力的一部分,不再是算法岗专属。
追问越来越依赖真实项目细节。像慢 SQL 排查、分布式锁这类题,光背标准答案基本过不了第二问——面试官普遍会追一句「你实际处理过的一次是什么样的」,没有具体案例支撑的回答很容易被追问打回原形。
常见问题
这份榜单是怎么统计出来的?
我们持续收录求职者反馈的真实面试记录,把同一道题的不同问法聚合到一起,按岗位、按最近 90 天的窗口比较每道题被提及的相对热度,取热度最高的一批收录进榜单。榜单只标注「高频/较高频/常规」这三档相对等级,不对外公开具体的提及次数和公司家数。
高频题背熟了是不是就能过面试?
不一定。高频题能帮你把有限的准备时间用在最可能被问到的方向上,但现在的面试官普遍会在第一问之后接着问项目细节和底层原理,照本宣科的回答很容易在追问环节露馅。建议每道题都配一个自己项目里的真实案例,解析里提到的追问方向提前在脑子里过一遍。
这份榜单多久更新一次?
按岗位滚动更新,统计窗口固定为最近 90 天,目的是让榜单反映当下的出题趋势,而不是几年前就流传的旧题。新一期发布后,旧版本会继续保留在站内存档,方便对比不同周期的热度变化。
有没有针对具体公司或者细分技术栈的版本?
官方榜单按岗位大类整理,覆盖的是这个岗位普遍会考的题。如果你有明确的目标公司或者具体的技术栈方向(比如只想练 Spring Cloud 微服务这一块),可以用面灵AI的定制题库功能,输入目标公司、岗位和你的简历,生成更贴合这三者的专属题库。
更多岗位合集
后端开发面试高频题 Top 25:真实面试热度榜(2026 年 7 月版)
基于后端开发岗近 90 天的真实面试记录整理:被问得最多的 25 道高频题,标注热度等级和近期实际出题的知名公司,附答题框架解析。
大模型与 AI Agent 面试题汇编:265 道大厂真题按主题归类(2026 版)
面灵AI 整理的大模型算法岗与 AI 应用开发岗面试题合集,265 道题按九大主题归类,覆盖 Transformer 结构、推理优化、RLHF 与 GRPO 对齐、RAG 全链路、AI Agent 架构与工具调用、上下文工程、多模态与具身智能,并标注近期实际出题的公司。