ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Java后端与AI岗面试高频考点与复习攻略

Java后端与AI岗面试高频考点与复习攻略 金九银十到了Java 岗和 Java(AI) 岗的面试量明显上来。这里先说结论单纯刷八股文过不了大厂但完全不看八股文也很难进面。真正的攻略是“知识体系 场景落地 模拟练习”三件事一起做。这篇文章直接给一套能执行的复习框架覆盖 Java 基础、并发编程、JVM、MySQL、Spring、场景题和 AI 应用岗的高频考察点。每个模块会拆出“面试官到底想问什么”“怎么用代码或命令验证”“哪些点最容易翻车”。内容适合准备社招和校招的 Java 后端、AI 应用开发岗位读者也适合已经在职但想系统补短板的人。1. Java(AI)岗面试核心能力速览先把复习地图铺开。面试不管怎么问最终都落在这几个维度上语言基础、并发能力、JVM 调优、数据库设计、框架原理、系统设计以及现在的 AI 应用工程化能力。维度核心考察点建议优先级复习耗时建议Java 基础集合、泛型、反射、IO、异常高3-4 天并发编程synchronized、volatile、AQS、线程池、ThreadLocal很高5-7 天JVM内存模型、垃圾回收、类加载、OOM 排查高5-7 天MySQL索引、事务、MVCC、锁、SQL 优化很高5-7 天SpringBean 生命周期、循环依赖、事务、自动配置高4-5 天场景题秒杀、分布式锁、消息队列、缓存一致性高5-6 天AI 应用大模型 API 接入、RAG、Agent、向量检索中高4-5 天这个表不是让你按顺序线性看完而是用来做“自检清单”。每天睡前对照表里某一行关掉文档用自己的话讲一遍。讲不出来的就是欠缺点第二天优先补。另外说一句从近期面试反馈看Java(AI) 岗并不是只问 AIJava 基础仍然占大头。很多候选人把精力全放在大模型概念上结果被问“HashMap 为什么线程不安全”“MySQL 索引失效场景”时反而讲不清这是最亏的。2. 适用人群与复习边界这套攻略适合三类人准备社招的 Java 后端开发目标是一线互联网公司或中大型企业。准备校招的应届生已经有 1-2 个项目但知识体系比较散。想转 AI 应用方向的 Java 开发需要补大模型应用层知识。不适合什么情况如果你连 Java 基础语法都不熟或者还没有一个完整跑起来的项目建议先花时间做项目直接冲面试题只会越背越慌。面试本质上是在验证“你有没有解决过真实问题”项目是载体八股是骨架两者缺一不可。还有一个边界要说清楚面试题没有标准答案同一个问题在不同职级下的深度完全不同。比如“讲一下 Spring 三级缓存”刚毕业的学生能说出“三级缓存是为了解决循环依赖”就算及格工作三年的人如果说不出“二级缓存能不能去掉”“AOP 代理对象何时创建”面试官就会怀疑。因此本文在讲每个知识点时都会标注“基础回答”和“加分回答”复习时按自己的目标职级选择深度。合规和道德边界也要注意AI 岗面试中可能会聊到 AIGC、人脸生成、声音克隆、数字人等内容这是行业热点但实际生产系统必须遵守版权和隐私规定。简历上写相关项目时要能说明数据来源合规、用户授权流程完整、生成内容有审核机制这反而是面试加分项。3. 复习环境与前置条件很多面试题光靠背记不住最好的方式是搭一个验证环境把关键结论跑一遍。建议本机准备JDK安装 JDK 8 和 JDK 17通过 JAVA_HOME 切换。很多公司老项目还在 JDK 8新 AI 项目可能用 JDK 17 或 21。Maven 3.6Gradle 可选。MySQL 5.7 或 8.0本机安装或用 Docker 都行。Spring Boot 2.7 或 3.x准备一个最小可启动的 Web 工程。IDEA配好常用调试快捷键。如果是带着 AI 岗位的需求再准备一个 OpenAI 兼容接口或本地模型接口即可用 Spring AI 的 ChatClient 写一个最简单的问答接口10 分钟就能跑通。# 查看 JDK 版本 java -version # 切换 JDK 示例macOS/Linux按实际安装路径修改 export JAVA_HOME/Library/Java/JavaVirtualMachines/jdk-17.jdk/Contents/Home export PATH$JAVA_HOME/bin:$PATH # 启动 MySQL 容器示例仅用于本地测试 docker run --name mysql8 -e MYSQL_ROOT_PASSWORDroot -p 3306:3306 -d mysql:8.0环境的作用不只是跑通而是让你在复习集合源码、JVM 参数、SQL 优化时有地方现场验证。4. Java 基础与并发编程高频面试点4.1 Java 基础集合与语言特性每次面试开头大概率是一道集合题最常见的是“HashMap 底层实现”。这里不要只背“数组链表红黑树”要把关键词串起来。一个合格的回答结构是HashMap 底层是 Node 数组默认容量 16负载因子 0.75。put 时先计算 key 的 hash再定位到桶位。链表长度超过 8 且数组长度超过 64 时转红黑树。扩容时新建 2 倍数组重新计算桶位。JDK 1.7 头插法有死循环问题JDK 1.8 改为尾插法。面试官接着大概率会问“HashMap 为什么线程不安全”答案要点是并发 put 可能导致数据覆盖扩容时可能导致链表环JDK 1.7所以多线程场景要用 ConcurrentHashMap。ConcurrentHashMap 的加分回答是JDK 1.7 用分段锁JDK 1.8 用 CAS synchronized 锁桶位锁粒度更细。4.2 并发编程synchronized、volatile 与线程池并发这一块是 Java 面试的分水岭也是场景题的基础。synchronized 要掌握修饰实例方法时锁的是 this。修饰静态方法时锁的是 Class 对象。修饰代码块时锁的是指定对象。JDK 1.6 之后有偏向锁、轻量级锁、重量级锁升级过程。synchronized 在字节码层面是 monitorenter / monitorexit。volatile 要掌握保证可见性和有序性但不保证原子性。底层用内存屏障禁止指令重排。典型应用是双重检查锁的单例模式。线程池是必考题至少要能手写参数并解释执行流程import java.util.concurrent.*; public class ThreadPoolDemo { public static void main(String[] args) { ThreadPoolExecutor pool new ThreadPoolExecutor( 2, // 核心线程数 4, // 最大线程数 60L, TimeUnit.SECONDS, // 空闲线程存活时间 new ArrayBlockingQueue(100), // 任务队列 Executors.defaultThreadFactory(), new ThreadPoolExecutor.AbortPolicy() // 拒绝策略 ); for (int i 0; i 10; i) { final int taskId i; pool.execute(() - System.out.println(Thread.currentThread().getName() 执行任务 taskId)); } pool.shutdown(); } }执行流程要能讲出来提交任务时如果当前线程数小于核心线程数创建新线程执行如果大于等于核心线程数优先放入队列队列满了且线程数小于最大线程数创建非核心线程队列满了且线程数达到最大触发拒绝策略。拒绝策略有四种AbortPolicy 直接抛异常CallerRunsPolicy 调用者自己执行DiscardPolicy 丢弃DiscardOldestPolicy 丢弃最老任务。ThreadLocal 也是高频题要重点讲内存泄漏ThreadLocalMap 的 key 是弱引用value 是强引用如果线程长期存活且不调用 removevalue 就无法回收可能造成 OOM。所以最佳实践是每次用完在 finally 里调用 remove。5. JVM 面试点内存模型、垃圾回收与 OOM 排查JVM 在 Java 面试中的比重最近几年明显上升尤其社招会问很多“排查类”题目。5.1 内存区域划分要能画出 JVM 运行时数据区堆、虚拟机栈、本地方法栈、程序计数器、元空间。重点讲堆存放对象实例分新生代和老年代Eden 区、Survivor 区默认比例 8:1:1。虚拟机栈每个线程一个栈栈帧包含局部变量表、操作数栈、动态链接、方法出口。元空间JDK 8 之后替代永久代使用本地内存存放类元信息。程序计数器记录当前线程执行字节码的行号不会 OOM。搜索热词里有“jre和jvm之间的关系”“jdk和jvm、jre的区别”这里补充一句JDK 包含 JRE 和开发工具JRE 包含 JVM 和核心类库JVM 是真正执行字节码的虚拟机。面试被问到不要慌用“包含关系”一条线讲清楚。5.2 垃圾回收重点讲可达性分析算法、GC Roots 有哪些、三色标记、垃圾回收器对比。GC Roots 包括虚拟机栈中引用的对象、方法区中静态属性引用的对象、方法区中常量引用的对象、本地方法栈中引用的对象。CMS 和 G1 的区别CMS 是标记-清除算法并发收集有碎片问题G1 是 Region 化布局可以设置预期停顿时间JDK 9 之后默认回收器是 G1。ZGC 适合超大堆场景停顿时间控制在毫秒级。面试官喜欢考“对象什么时候进入老年代”大对象直接进入老年代长期存活对象超过 MaxTenuringThreshold 进入老年代动态年龄判断Survivor 区相同年龄对象大小总和超过 Survivor 一半年龄大于等于该值的对象直接进老年代。5.3 JVM 参数与 OOM 排查能写出常用 JVM 参数是加分项# 常见 JVM 启动参数示例 -Xms2g -Xmx2g -Xmn512m -XX:MetaspaceSize256m -XX:MaxMetaspaceSize512m -XX:UseG1GC -XX:MaxGCPauseMillis200 -XX:HeapDumpOnOutOfMemoryError -XX:HeapDumpPath/data/dump/OOM 排查步骤要能背下来先看日志确认是堆 OOM 还是元空间 OOM 还是栈溢出。拿到 Heap Dump 文件用 MAT 或 JProfiler 分析。找占用内存最大的对象看是业务对象还是线程对象。结合代码定位可疑点比如没有释放的集合、ThreadLocal 未 remove、大对象缓存。常用排查命令jps查看 Java 进程。jstat -gcutil 查看 GC 情况。jmap -dump:formatb,fileheap.hprof 导出堆快照。jstack 查看线程栈。实际面试中把“思路”讲清楚比背命令更重要。比如“线上 CPU 飙高”的排查思路top 找到进程top -Hp 找到线程jstack 导出线程栈用十六进制线程号定位问题代码。6. MySQL 面试点索引、事务与锁机制MySQL 是 Java 后端面试的必考题像“MySQL 中 int5”“update 语法”这种细分点也可能出现在基础题里但核心还是索引、事务、锁。6.1 索引原理必答点InnoDB 使用 B 树作为索引结构主键索引是聚簇索引叶子节点存整行数据二级索引叶子节点存主键值所以回表是查二级索引后再查主键索引。索引失效场景要能列举最左前缀原则联合索引中跳过最左列。对索引列使用函数或计算。隐式类型转换。LIKE 以 % 开头的模糊查询。使用 OR 且两侧有非索引列。加分回答是“覆盖索引”如果查询的列都在二级索引里就不需要回表例如SELECT id, name FROM user WHERE name x其中 (name, id) 是联合索引则直接走索引扫描。加分的还有“索引下推”ICP在存储引擎层先过滤索引包含的字段减少回表次数。6.2 事务与 MVCCACID 要能展开隔离级别必须背熟READ UNCOMMITTED脏读。READ COMMITTED不可重复读。REPEATABLE READ可重复读InnoDB 默认级别解决幻读靠 MVCC 间隙锁。SERIALIZABLE串行化。MVCC 的核心是隐藏列DB_TRX_ID、DB_ROLL_PTR、DB_ROW_ID以及 undo log 版本链和 ReadView。要能讲出 RC 和 RR 下 ReadView 创建时机的区别RC 是每次快照读都生成新 ReadViewRR 是事务内第一次快照读生成一次。redo log 和 undo log 也要区分redo log 保证持久性记录物理修改崩溃恢复用。undo log 保证原子性记录逻辑反向操作回滚和 MVCC 用。两阶段提交保证 binlog 和 redo log 的一致性。6.3 锁机制背清楚锁的分类全局锁、表级锁、行级锁共享锁、排他锁记录锁、间隙锁、Next-Key Lock。一个常见问题“RR 隔离级别如何解决幻读”答案是当前读用 Next-Key Lock快照读用 MVCC。SQL 优化流程可以给一个演示-- 查看执行计划 EXPLAIN SELECT id, name, status FROM order_info WHERE user_id 123 AND status 1 ORDER BY create_time DESC LIMIT 20;重点看 type 字段system const eq_ref ref range index ALL。ALL 就是全表扫描需要优化。然后看 key 是否用到了索引rows 是否过大Extra 是否出现 Using filesort 或 Using temporary。6.4 常见 SQL 细节搜索热词里出现“mysql中int5”“mysql update语法”“mysql存储过程”这些属于基础细节复习时不要忽略。例如-- int5 是隐式类型转换的常见面试题 -- 假设 age 列是 varchar下面语句会导致索引失效 SELECT * FROM user WHERE age 5 30; -- 正确写法避免在索引列上做运算 SELECT * FROM user WHERE age 25;UPDATE 语句要掌握和 SELECT 的锁差异。普通 UPDATE 会加排他锁如果更新条件不走索引可能锁全表这就是线上事故常见原因。7. Spring 面试点生命周期、循环依赖与 Spring AI7.1 Bean 生命周期Spring 的 Bean 生命周期是必考题一般问法有“Bean 的完整生命周期”“BeanPostProcessor 有什么用”“三级缓存为什么是三级”。一个完整的生命周期可以这样串实例化前BeanPostProcessor 的 postProcessBeforeInstantiation。实例化通过反射创建对象。属性填充设置 Bean 的属性。Aware 回调设置 BeanName、ApplicationContext 等。BeanPostProcessor 前置处理。InitializingBean 的 afterPropertiesSet 和 init-method。BeanPostProcessor 后置处理这里是 AOP 代理生成的关键点。使用 Bean。销毁DisposableBean 和 destroy-method。加分回答要提到 “BeanPostProcessor 是所有 Spring 扩展的入口”比如 Autowired 依赖注入就是 AutowiredAnnotationBeanPostProcessor 在做。7.2 循环依赖与三级缓存这个问题能区分“背过”和“真懂”。核心概念一级缓存 singletonObjects完整的单例对象。二级缓存 earlySingletonObjects提前暴露的半成品对象没有完全初始化没走 BeanPostProcessor 后置。三级缓存 singletonFactories存放 ObjectFactory可以提前生成 AOP 代理对象。为什么需要三级缓存而不是二级关键点在于 AOP。如果只有二级缓存提前暴露的对象必须已经确定是原始对象还是代理对象。但 Spring 的 AOP 代理是在 BeanPostProcessor 后置处理时才创建的。存在循环依赖时无法在实例化阶段确定要不要生成代理。所以三级缓存放的是 ObjectFactory在 getEarlyBeanReference 时提前调用如果 Bean 需要 AOP就会生成一个早期代理对象放入二级缓存。这就是三级缓存的真正价值既能解决循环依赖又能在必要的时候提前创建代理。项目里如果遇到和 Spring 相关的问题可以从“Bean 生命周期 三级缓存 AOP 代理时机”三个点串联回答这比单独背任何一个知识点都更有说服力。7.3 事务与自动配置Spring 事务要掌握Transactional 的原理是基于 AOPSpring 会为 Bean 生成代理对象。事务传播机制包括 REQUIRED、REQUIRES_NEW、NESTED、SUPPORTS、NOT_SUPPORTED、MANDATORY、NEVER。自调用失效同类内部方法调用不经过代理对象Transactional 不生效。方法非 public 导致事务失效。数据库引擎必须支持事务MyISAM 不支持。Spring Boot 自动配置的面试要点是“SpringBootApplication 三个注解组成”“EnableAutoConfiguration 如何加载 META-INF/spring.factories 中的自动配置类”“条件注解 ConditionalOnClass / ConditionalOnMissingBean”。7.4 Spring AIJava 做 AI 应用AI 岗面试中Spring AI 是最贴近 Java 工程师的切入点。Spring AI 提供了类似 Spring 风格的 AI 应用集成核心组件包括ChatClient统一的大模型对话客户端。EmbeddingModel文本向量化接口。VectorStore向量数据库抽象。Advisor提示词、记忆、工具调用等扩展点。可以准备一个最小示例// Spring AI 简单问答示例依赖 spring-ai-starter按实际版本调整 RestController public class ChatController { private final ChatClient chatClient; public ChatController(ChatClient.Builder builder) { this.chatClient builder.build(); } GetMapping(/chat) public String chat(RequestParam String message) { return chatClient.prompt(message).call().content(); } }面试问 AI 场景时重点不是让你训练模型而是看你能不能把 Java 工程能力和大模型 API 结合起来。比如“做一个知识库问答系统”你需要说清楚文档加载、分块、Embedding、向量存储、检索、Prompt 组装、答案生成这几步。8. 场景题系统设计题与 AI 应用场景题场景题是社招面试的压轴题也是最能体现“10面9过”的关键。没有标准答案但考察思路。8.1 秒杀系统高频。回答要点页面静态化 CDN 降低静态资源压力。接口限流比如令牌桶限流。先扣减 Redis 库存再异步写数据库。MQ 削峰订单创建走异步。分布式锁防止超卖。数据库兜底扣库存 update 语句加条件stock 0。手写一个 Redis 分布式锁伪代码// 基于 Redis SET NX EX 的分布式锁伪代码 String lockKey product:1001:lock; String requestId UUID.randomUUID().toString(); Boolean locked redisTemplate.opsForValue() .setIfAbsent(lockKey, requestId, 10, TimeUnit.SECONDS); if (Boolean.TRUE.equals(locked)) { try { // 扣库存逻辑 } finally { // Lua 脚本保证判断和删除的原子性 String script if redis.call(get, KEYS[1]) ARGV[1] then return redis.call(del, KEYS[1]) else return 0 end; redisTemplate.execute(new DefaultRedisScript(script, Long.class), Collections.singletonList(lockKey), requestId); } }加分点锁的 key 要带业务维度value 要带请求唯一 ID过期时间要合理释放锁要用 Lua 脚本保证原子性。8.2 订单超时关闭回答点延迟队列RabbitMQ 的 TTL 死信队列。Redis 过期监听但不建议作为唯一方案可能丢消息。定时任务轮询批量扫描订单表注意分页和查询范围。Java DelayQueue 只适合单机。面试官会追问为什么 Redis 过期事件不可靠因为 Redis 的过期通知不是精确的且消息可能在发布时因订阅关系未建立而丢失。更稳妥的方案是用定时任务 状态机。8.3 AI 场景题RAG、Agent、向量检索AI 岗位场景题通常有这几类如何做一个基于私有文档的知识库问答系统。Agent 工具调用怎么设计。大模型幻觉怎么缓解。如何评估 RAG 效果。回答模板可以这样表达知识库问答系统分为离线和在线两部分。离线流程数据清洗去重。文档分块块大小根据模型上下文窗口确定。调用 EmbeddingModel 向量化。写入向量数据库。在线流程用户问题向量化。相似度检索 Top-K。将检索结果和用户问题组装成 Prompt。调用大模型生成答案。缓解幻觉的办法检索结果不相关时让模型回答“知识库中未找到相关内容”。引用来源输出时附带文档 ID。做答案与检索内容的一致性校验。对置信度低的检索结果直接放弃。Agent 工具调用的核心是让模型生成结构化调用参数Java 侧用 Function Calling 或 Spring AI 的工具调用机制把模型输出映射到本地方法执行。这里要能说清“工具注册、参数解析、结果回填、记忆管理”四件事。9. 批量刷题与模拟面试高效复习流程这一节把复习本身当成一个“批量任务”来管理。每天刷题不要只追求数量要按下面这套流程跑。9.1 分模块建立错题本建议按模块维护一个错题本格式固定问题我的回答参考答案要点关联项目状态HashMap 为什么线程不安全只说“会丢数据”并发 put 覆盖 JDK1.7 扩容死循环项目里用 ConcurrentHashMap已掌握G1 和 CMS 区别说不清Region 化、停顿时间可控、RSet无待复习这个表格比单纯收藏题库更有用因为它在强制你“输出”。9.2 刷题节奏推荐“3:1:1”节奏3 天专题复习一个模块。1 天做场景题和项目复盘。1 天模拟面试。每天固定时间用语音口述方式回答问题录音后回听。很多人一听录音就发现自己背得熟却表达不连贯这就是模拟的价值。9.3 项目深挖准备面试翻车重灾区是“项目细节答不上来”。准备项目时要能回答以下问题项目的核心业务是什么用户量多少机器配置多少。你负责的模块有哪些核心接口QPS 多少。数据库表结构设计索引怎么建为什么。遇到过哪些线上问题怎么排查的。如果重新设计你会改哪些地方。建议用“问题清单”方式写下来每个项目准备 10-15 个问题。10. 面试常见问题与排查方法问题现象可能原因排查方式解决方案八股文背了但项目里用不上知识点没和项目绑定检查每个知识点能否对应到项目模块为每个知识点找一个项目中的真实场景项目深挖答不上来简历写太满细节没复盘找同事或自己按简历逐条追问把项目上线时间、数据量、难点写成文档HashMap 源码被问“源码级别”只背了结论没看代码打开 JDK 源码读 JDK 8 的 put 流程自己画 put 流程图并发编程只会语法不会设计缺少线程压测概念用高并发模拟器或 Jmeter 测试写一个多线程扣库存 DemoMySQL 索引失效题不会不知道执行计划怎么看用 EXPLAIN 逐条验证建几张表自己造数据测索引Spring 循环依赖被追问“三级缓存为什么是三级”停留在背概念读 DefaultSingletonBeanRegistry 源码画出三级缓存调用时序AI 题完全没准备岗位要求变化快了解岗位 JD 中的 AI 关键词先跑通 Spring AI 最小示例手写代码紧张卡住平时写得少限时手写常见算法题每天手写 1-2 个题场景题没有答题套路缺少结构化表达复盘标准答案的结构使用“需求分析-方案设计-容量估算-风险点”模板排错原则就一条面试问题答不上来时不要沉默把自己想到的相邻知识说出来展示思考过程。面试官更看重候选人遇到未知问题时的排查路径。11. 最佳实践与最终复盘最后给一套可落地的执行清单。第一简历上写到的技术栈每个都要能“讲 3 分钟”。比如写了 Redis就要能说清缓存穿透、缓存击穿、缓存雪崩、分布式锁、持久化、淘汰策略。不要写“了解”但没有证据。第二每天坚持做一次“口述输出”。找一道题不看资料用录音讲 3 分钟再对照标准答案修改。坚持一周表达能力会明显提升。第三场景题一定要用“结构”答。先复述需求和边界再给整体链路然后分模块讲方案最后补主动风险提示。这比背一种解法值钱得多。第四AI 岗候选人至少跑通一个最小 AI 应用 Demo比如 Spring AI 接大模型 API 做一个简单问答或者做一个本地文档检索的 RAG 案例。不需要复杂但要能现场演示原理。第五面试前两晚不要再学新知识重点做三件事过一遍错题本把项目问题清单读一遍把 JVM 和 MySQL 常见命令在脑海里过一遍。金九银十的本质是信息差加准备的竞争。岗位放出来的窗口期不会很久与其焦虑“到底面什么”不如用一周时间把本文的知识地图跑一遍先广度后深度再配合两三次模拟面试胜率比盲目刷题高得多。
返回列表