Java AI岗面试突击指南:从高频题到项目表达的高质量复习链路

发布时间:2026/8/30 18:07:33
Java AI岗面试突击指南:从高频题到项目表达的高质量复习链路 2026年的JavaAI岗面试考察范围比普通Java研发岗更宽。候选人既要能回答HashMap、线程池、JVM内存模型又要能解释MySQL索引、Spring循环依赖还很可能被问到大模型接口调用、Prompt设计、RAG相关场景。加上秋招和“金九银十”窗口期短很多人的真实困境是资料收集了一大堆真正能内化的没有多少。这个阶段的突击重点不是“把八股文背完”而是建立一条从知识点到面试表达的高质量链路高频题定位薄弱点最小代码验证记忆项目场景题组织输出模拟面试修正表达。这篇文章按这个链路给出可执行的复习路线适合正在准备秋招、打算抓住金九银十机会的Java后端候选人也适合从普通Java开发转向Java AI应用方向的人。1. 先想清楚Java AI 岗短期突击到底在突什么1.1 面试官在短时间内如何筛选候选人技术面试时间通常在45到60分钟面试官要在有限时间内判断三件事基础是否扎实、有没有真实项目经验、是否值得一起做复杂工程。Java AI岗还会多一层要求是否理解AI应用的落地方式比如调用大模型接口、处理上下文、做检索增强、评估结果质量。短期突击不能平均用力。面试官问“HashMap在JDK 8中有什么变化”和问“你项目中线程池参数怎么设置的”用的是两种考察逻辑。前者考记忆和理解后者考工程判断。真正有效的复习是用高频问题反向推导出需要补齐的知识点然后用能随时讲清楚的方式来组织答案。下面这张表可以作为优先级参考考察维度高频问题类型短期提分动作Java基础String、集合、异常、泛型、反射每天过10道高频题关键结论自己讲一遍并发编程JMM、锁、线程池、ThreadLocal、CAS跑通一个并发Demo能解释输出结果JVM内存分区、对象创建、GC、OOM排查用 jstat 或 jmap 看一次真实进程MySQL索引、事务隔离、MVCC、慢SQL优化用 explain 分析10条SQLSpringIOC、AOP、Bean生命周期、事务传播画出Bean生命周期和三级缓存图AI应用Spring AI、大模型调用、RAG、Prompt跑通一个 ChatClient 示例1.2 为什么“收集八股文大全”不是最快路径很多人喜欢先收集一份“Java面试大全”再从头看到尾。问题是这类资料通常几百页内容互相重复而且只给结论不给推理过程。背下来的东西一旦面试官换一个问法就答不出来。八股文不是不能背而是要先背“结论骨架”再用代码或场景去验证。例如“HashMap负载因子是0.75”如果只知道这个数面试官继续问“为什么不是0.5或1.0”就卡住了。更稳的做法是知道0.75是空间和时间的折中负载因子太低会频繁扩容浪费内存太高会提高哈希冲突概率影响查找效率。这样回答自然比单纯背一个数字有说服力。因此短期突击的核心不是收集资料而是压缩成“问题-结论-验证-表达”四段。每遇到一个问题先写一句话结论再用代码、命令或画图验证最后模拟回答一遍。这个动作比看十篇博客更有用。1.3 用一份自测清单快速定位薄弱点开始复习前先花一到两小时做一次自测。下面六个问题覆盖Java AI岗的核心模块每道题都需要能在5分钟内给出有层次的回答能写出 ConcurrentHashMap 在 JDK 8 中的 put 流程吗能解释 volatile 和 AtomicInteger 的区别吗能画出 JVM 运行时数据区并说出每个区域可能抛出的异常吗能说清楚 explain 结果中 key、rows、Extra 三个字段的意义吗能解释 Spring 解决循环依赖为什么需要三级缓存二级缓存够不够吗能说出用 Spring AI 发起一次大模型调用需要哪几步吗自测结果建议按下面规则调整计划自测结果复习策略只能答出0到2题先补基础模块Java基础、并发、JVM优先能答出3到4题进入项目复盘和场景题阶段同时补弱项能答出5到6题重点练面试表达、追问应对和算法手写2. Java 基础与并发模块用高频题清掉记忆盲区2.1 Java 基础集合、String、异常、泛型、反射Java基础部分看起来简单但面试官喜欢从这些题里看候选人是否真正理解语言特性。常见高频题和必答要点整理如下高频问题必答要点String 为什么不可变内部字符数组用 final 修饰没有提供修改字符内容的方法字符串常量池复用依赖不可变ArrayList 和 LinkedList 区别ArrayList基于动态数组查询快尾部插入快LinkedList基于双向链表中间插入删除方便但需要遍历HashMap 扩容机制默认容量16负载因子0.75扩容时容量翻倍JDK 8中链表长度超过8且数组长度超过64会树化JDK 7 和 JDK 8 的 ConcurrentHashMapJDK 7用Segment分段锁JDK 8用Node数组加synchronized和CASJDK动态代理和CGLIBJDK动态代理要求目标类实现接口CGLIB通过生成目标类的子类实现代理这里重点说 HashMap。负载因子0.75不是随意取的值它同时考虑冲突概率和空间利用率。在理想随机哈希下负载因子为0.75时桶中出现链表长度超过8的概率极低所以JDK 8把树化阈值设为8。如果负载因子设为1空间利用率高但碰撞变多如果设为0.5查找更快但一半空间浪费。这个权衡思路比记住数字更重要。JDK 8 的 ConcurrentHashMap 也常被追问。它的 put 流程可以概括为根据 key 计算哈希定位到 Node 数组槽位如果槽位为空用 CAS 尝试放入新节点如果槽位不为空对槽位节点加 synchronized 锁如果节点是链表就追加到链表尾部如果是树节点就执行红黑树插入如果链表长度到达8且数组长度达到64转为红黑树最后检查是否需要扩容。这段流程要能边画图边讲而不是只报出结论。2.2 并发编程JMM、锁、线程池、ThreadLocal并发是Java面试中区分度很高的一部分。最常考的几个点包括JMM、volatile、synchronized锁升级、CAS、AQS、线程池参数、ThreadLocal内存泄漏。volatile是一个容易答半截的知识点。volatile保证可见性和有序性但不保证原子性。下面这段代码可以说明问题public class VolatileCounter { private volatile int count 0; public void increment() { count; } }count 并不是一个原子操作它包含读取 count、计算 count1、写回 count 三步。volatile 只保证某线程写回后其他线程能看到最新值但多个线程同时执行“读-改-写”时仍然会出现值覆盖。要让计数器线程安全可以使用 AtomicInteger 或 synchronizedpublic class SafeCounter { private final AtomicInteger count new AtomicInteger(0); public void increment() { count.incrementAndGet(); } }线程池是项目场景题的重灾区。面试官常要求写出 ThreadPoolExecutor 的构造参数并解释每个参数的作用ThreadPoolExecutor executor new ThreadPoolExecutor( 2, 4, 60L, TimeUnit.SECONDS, new ArrayBlockingQueue(10), r - new Thread(r, biz-thread- r.hashCode()), new ThreadPoolExecutor.CallerRunsPolicy() );参数含义如下参数作用面试常问点corePoolSize核心线程数新任务先交给核心线程执行maximumPoolSize最大线程数队列满且核心线程都在忙时才会创建新线程keepAliveTime非核心线程空闲存活时间可设置为0表示立刻回收workQueue工作队列无界队列可能导致任务堆积和OOMthreadFactory线程工厂建议给线程命名方便排查问题handler拒绝策略AbortPolicy、CallerRunsPolicy、DiscardPolicy、DiscardOldestPolicy不要只背参数要能把“线程池处理流程”讲清楚核心线程是否空闲不空闲则入队队列满了再尝试创建线程到 maximumPoolSize如果还处理不了触发拒绝策略。如果换成无界队列maximumPoolSize 实际不会生效这是很多人容易踩的坑。ThreadLocal 也是高频题。它通常被问到“为什么会导致内存泄漏”。ThreadLocalMap 的 key 是 WeakReferencevalue 是强引用。如果 key 被回收而 value 没有清理就会形成一条 key 为 null 但 value 可达的Entry。在线程池场景下线程复用导致这些 Entry 一直存在可能OOM。因此业务代码使用 ThreadLocal 后要在 finally 中调用 removeThreadLocalString context new ThreadLocal(); try { context.set(userId-1001); // 业务逻辑 } finally { context.remove(); }2.3 并发场景题库存扣减、缓存刷新、异步任务面试官很少直接问“什么是乐观锁”而是给一个场景秒杀场景下如何扣减库存不超卖。这个时候不要一上来就说 Redis 分布式锁而要先区分单机数据库方案和分布式方案。最简单可靠的方案是 SQL 条件更新UPDATE product_stock SET stock stock - 1, version version 1 WHERE product_id #{productId} AND stock 1;这条SQL通过 stock 1 条件避免库存被扣成负数。用 version 做乐观锁可以在此基础上做防重复提交。但这套方案在极端流量下会集中更新同一行出现锁竞争。继续演进的方向包括先 Redis 扣减再异步同步数据库、分段库存、对账补偿等。回答这类场景题的关键是展现“先单机、后分布式先保证正确性、再追求性能”的思路。不要一上来就堆一堆中间件面试官更看重推理过程。3. JVM 不能只背分区要能画出内存图、说清回收和排查3.1 运行时数据区与对象创建过程JVM题目在Java面试中几乎是必考。很多候选人能把五个区域背出来但遇到“一个对象到底是怎么创建出来的”就讲不全。对象创建过程可以拆成五步类加载检查执行 new 指令时检查常量池中能否找到对应类的符号引用并检查类是否已完成加载、解析、初始化。分配内存根据对象大小在堆中划分一块区域分配方式有指针碰撞和空闲列表两种。内存空间初始化将分配到的内存初始化为零值保证实例字段在未赋初值时可被使用。设置对象头记录对象所属类、哈希码、GC分代年龄、锁标记等信息。执行构造方法执行 new 之后的 init 方法完成实例字段的赋值和构造逻辑。运行时数据区也要能区分线程共享和线程私有区域共享状态异常堆线程共享OutOfMemoryError: Java heap space方法区/元空间线程共享OutOfMemoryError: Metaspace虚拟机栈线程私有StackOverflowError本地方法栈线程私有StackOverflowError程序计数器线程私有无只背表格不够要能结合执行过程讲每个线程执行方法时虚拟机栈会创建栈帧一个方法对应一个栈帧StackOverflowError 通常是因为递归过深。3.2 垃圾回收算法与 G1/ZGC 参数垃圾回收算法需要讲清楚三种基础算法标记清除、标记复制、标记整理。它们的适用场景和缺点要心里有数。JVM内存池分代后新生代对象存活率低适合用复制算法老年代对象存活率高适合用标记整理或标记清除。CMS和G1是不同的落地实现。G1是Java 8之后常用的收集器核心设计是Region化堆和可预测停顿时间。G1把堆分成多个大小相同的Region每一个Region在逻辑上可以是Eden、Survivor或Old。它通过维护RSet记录Region之间的引用关系减少全堆扫描。常用参数示例java -Xms4g -Xmx4g -XX:UseG1GC -XX:MaxGCPauseMillis100Xms和Xmx一般建议设置为相同值避免运行期动态扩容。MaxGCPauseMillis是目标停顿时间不保证一定达到但G1会尽量调整回收策略。实际项目中设置完还要观察GC日志确认效果。如果面试被问到 ZGC至少要说出它最大的特点是“暂停时间与堆大小无关”并且支持TB级堆。ZGC的GC停顿可以控制在几毫秒以内但需要根据JDK版本确认使用场景。生产环境选型要看版本、堆容量和业务容忍度不要盲目追新。3.3 用一条 OOM 排查链路结束 JVM 盲背面试官问 JVM 时经常用“线上OOM你怎么排查”来区分只会背书的人和有实战经验的人。可以先给出现象java.lang.OutOfMemoryError: Java heap space然后说排查链路先获取Java进程号使用 jps -l观察GC状态使用 jstat -gcutil 1000 10看Eden、Old区增长和GC频率查看堆中对象分布使用 jmap -histo | head -30如果确认需要分析内存在允许的情况下 dump 堆快照 jmap -dump:formatb,file/tmp/app.hprof用 MAT 或 VisualVM 分析大对象、支配树和GC Roots。命令代码如下jps -l jstat -gcutil 12345 1000 10 jmap -histo 12345 | head -30 jmap -dump:formatb,file/tmp/app.hprof 12345注意生产环境不要直接对在线服务执行 jmap dump否则会挂起进程。更稳妥的做法是提前配置JVM参数在OOM时自动生成dump-XX:HeapDumpOnOutOfMemoryError -XX:HeapDumpPath/tmp/app.hprof这种处理方式要按学习环境和生产环境区分说清楚。本地开发可以随意用 jmap 观察生产环境要结合监控、告警和运维工具优先保留现场再分析。另一个常见OOM类型是线程数耗尽java.lang.OutOfMemoryError: unable to create new native thread这类错误通常不是堆内存不足而是操作系统不允许进程创建更多线程。需要检查 ulimit -u、系统内存和线程栈大小。不要一看到 OOM 就联想到堆扩容。下表是常见OOM类型速查OOM类型出现区域排查方向Java heap space堆dump分析大对象、内存泄漏Metaspace元空间类加载器泄漏、动态类生成unable to create new native thread操作系统线程数限制、内存不足Direct buffer memory堆外内存检查NIO的ByteBuffer分配和释放4. MySQL 与 Spring用场景题把知识点连成链路4.1 MySQL 索引、事务、SQL 优化问题MySQL题不能只背“索引是什么”要能落到 explain 和真实SQL优化上。面试官给一条慢SQL希望你说出怎么看执行计划、怎么定位问题。下面是一条典型查询EXPLAIN SELECT order_no, amount FROM orders WHERE user_id 1001 AND status PAID ORDER BY create_time DESC LIMIT 20;看 explain 结果时优先级最高的是 type、key、rows、Extra。type 从好到差常见顺序是system、const、eq_ref、ref、range、index、ALL。如果看到 ALL说明是全表扫描需要检查是否能用索引。rows 是一个估算值表示要扫描的行数。Extra 中常见的有 Using index、Using where、Using filesort、Using temporary。出现 Using filesort 通常意味着排序没有用到索引出现 Using temporary 意味着查询用了临时表都可能成为优化点。索引失效是高频题目常见场景如下索引失效场景原因处理建议对索引列使用函数或运算破坏B树有序性改写成无函数形式或建函数索引隐式类型转换字段类型和参数不一致保证参数类型与字段一致LIKE左模糊 %xxx前导未知无法定位考虑全文索引或搜索引擎联合索引不满足最左前缀索引无法从第一个字段开始匹配调整查询条件顺序或建对应索引使用OR且有一侧无索引无法使用索引合并分开查询或为OR两侧建索引事务隔离级别也要能默写隔离级别脏读不可重复读幻读Read Uncommitted可能可能可能Read Committed不可能可能可能Repeatable Read不可能不可能可能但InnoDB间隙锁可避免Serializable不可能不可能不可能MySQL默认隔离级别是 Repeatable Read。InnoDB 通过 MVCC 和间隙锁解决了一部分幻读问题但要理解“当前读”和“快照读”的差异。快照读通过 undo log 实现一致性视图当前读需要加锁所以 select ... for update 加间隙锁来避免幻读。4.2 Spring IOC、AOP、循环依赖和事务传播Spring题最常问的四个方向是Bean生命周期、循环依赖、AOP、事务传播。Bean生命周期不需要把十三个步骤全背下来但要能说清主干实例化、属性填充、初始化、使用、销毁。BeanPostProcessor 在初始化前后介入AOP代理就是在这个阶段创建出来的。循环依赖是经典题。Spring 默认支持单例Bean的 setter 循环依赖构造器循环依赖不支持。解决方式是通过三级缓存第一级缓存singletonObjects保存完整Bean第二级缓存earlySingletonObjects保存早期暴露的原始Bean第三级缓存singletonFactories保存对象工厂。二级缓存能不能解决能解决“提前创建Bean”的问题但不一定能解决“代理对象提前暴露”的问题。Spring通过三级缓存在需要提前引用时通过工厂把代理逻辑执行清楚。所以回答时要强调三级缓存区分了“普通对象”和“代理工厂”这是关键。AOP部分要能回答底层机制。Spring AOP基于动态代理有接口时使用 JDK 动态代理没有接口时使用 CGLIB。事务也是通过 AOP 实现的所以加了 Transactional 的类被代理后事务才会生效。事务传播行为是另一个高频点。下面这张表要理解而不是死背传播行为行为含义常见使用场景REQUIRED有事务则加入无事务则新建默认值适合大多数业务REQUIRES_NEW挂起当前事务新建独立事务日志、消息发送不希望随主事务回滚NESTED在嵌套事务中执行部分回滚场景SUPPORTS有事务则使用无事务则以非事务执行查询方法实际项目中 Transactional 失效是最常见的坑。失效原因包括方法被 private 修饰、类没有被Spring管理、方法内部自调用、异常被 catch 后没有抛出、抛出的是 checked exception 而事务默认只回滚 RuntimeException。这些要能说出两三个。4.3 Spring AI 面试需要掌握到什么程度对于Java AI岗面试官不一定要求你训练模型但希望你知道AI应用怎么和Spring工程结合起来。Spring AI 是Spring生态中用来接入大模型能力的模块核心能力包括 ChatClient、Prompt模板、输出解析、Embedding、VectorStore 和 RAG 相关组件。如果项目中使用 Spring AI最小调用可以写成类似下面这样ChatClient chatClient ChatClient.builder(chatModel).build(); String answer chatClient.prompt() .system(你是一名Java面试官请用简洁的方式回答问题。) .user(解释一下JVM堆和栈的区别。) .call() .content(); System.out.println(answer);这里不需要把代码背下来但要理解几个关键对象ChatModel 负责和大模型交互ChatClient 封装了 prompt 和 response 的处理流程。实际版本中 API 可能有差异落地前要以官方文档为准。RAG 是AI应用另一大考点。回答时按流程走加载文档读取PDF、Word或网页内容分片把长文本切分成适合向量化的片段向量化通过 EmbeddingModel 把文本变成向量存储把向量存入 VectorStore检索用户提问时先用向量检索找到最相关的片段增强生成把检索结果拼进 prompt再调用大模型生成答案。面试官问你“为什么需要RAG”时核心答案是让模型基于私有知识或最新知识回答减少幻觉同时避免频繁重训模型。回答时要提到“上下文长度限制”和“知识时效性”。生产环境接入大模型还需要特别注意API密钥不能硬编码在代码里要放在环境变量或配置中心Prompt中可能涉及敏感信息时要过滤模型输出要做格式校验。这些属于工程安全问题面试中主动提到会加分。5. 项目复盘、场景题和算法题怎么组合准备5.1 用 STAR 把项目讲成“可追问”的技术方案很多候选人项目经验不差但面试时讲得像流水账。更好的方式是用 STAR 结构组织成四段Situation项目背景解决什么问题。Task你承担的任务和核心目标。Action你具体做了什么为什么选择这个方案。Result结果如何能用数据表达更好。例如“订单系统性能优化”可以这样组织背景是订单列表页高峰期响应慢任务是让查询响应时间从2秒降到500毫秒以内行动是先加缓存再优化慢SQL并用 explain 定位了索引失效结果是高峰期平均响应时间降到300毫秒。每说完一句都要准备好被追问“缓存和数据库怎么保持一致”“失效的索引为什么失效”“有没有监控数据”。项目里至少要准备三个技术难点例如缓存穿透、超卖、分布式事务。每个难点都要有“方案对比”和“为什么选这个方案”。不要只讲结果要展现出当时做过取舍。5.2 高频场景题缓存、分布式锁、消息队列纯零散八股只占一部分真正让面试官记住你的是场景题的处理路径。高频场景题建议重点准备场景题考察点回答主线缓存穿透怎么办布隆过滤器、空值缓存先解释原理再说方案缓存击穿和雪崩热点过期、重建锁互斥重建、逻辑过期、多级缓存超卖怎么解决数据库唯一性、乐观锁从SQL条件更新讲到Redis扣减MQ消息丢了怎么办生产者、Broker、消费者分段确认机制重复消费怎么解决幂等设计状态机、唯一键、Redis幂等分布式锁用什么Redis和ZooKeeper比较SETNX和Watch机制回答这类题最忌讳一开始就抛出复杂架构。先给一个能保证正确性的简单方案再讨论在高并发下如何演进这是面试官更喜欢的思考方式。5.3 算法题短期刷题顺序和模板算法题在Java AI岗面试中依然是筛选条件。短期突击不建议按题库顺序刷而是按题型分类数组和双指针处理有序数组、快慢指针链表反转、合并、找环二叉树递归遍历、层序遍历、最近公共祖先哈希表两数之和、滑动窗口动态规划爬楼梯、最长回文子串、背包问题堆和栈TopK、单调栈图邻接表、DFS/BFS。每个类型准备一两个模板方法。比如二分查找模板int left 0, right nums.length - 1; while (left right) { int mid left (right - left) / 2; if (nums[mid] target) { return mid; } if (nums[mid] target) { left mid 1; } else { right mid - 1; } } return -1;算法题要保证“高频基础题能30分钟内写出来”不要沉迷难题。6. 面试表达与临场应变的可训练方法6.1 一道技术题的答题结构结论-原理-场景-权衡技术面试最怕的不是不会而是会但讲不清楚。用统一结构回答能明显改善输出质量先给结论再讲原理再挂场景最后说权衡。例如问“线程池核心线程数怎么设置”结论没有固定公式取决于任务类型和系统资源原理CPU密集型任务线程数接近CPU核数IO密集型任务可以设置更多线程因为大部分时间在等待场景如果线程在调用远程接口或查询数据库核心线程数偏大更合理权衡线程过多会带来上下文切换最终需要压测验证。这种结构最大的好处是即使某一部分讲得不够深入面试官也能看出你有一个完整的分析框架。6.2 遇到不会的题怎么办面试一定会遇到盲区。正确的处理方式是先复述题目确认自己理解是否正确说出自己知道的相关部分分析可能的切入点和面试官确认方向后再尝试回答。比如问“你知道ZGC的实现原理吗”你可以先答“我了解ZGC的停顿时间几乎与堆大小无关底层使用染色指针和读屏障但具体细节我不展开。如果你希望我说说G1和ZGC的选型我可以讲。”这比直接说“不会”好得多。面试官想看到的是诚实度和逻辑推导能力而不是假装会。6.3 模拟面试与录音复盘怎么做模拟面试不是“随便聊一聊”而是要有时间限制和追问。可以找同学或朋友当面试官把高频题分成几组每组20分钟提问中途不许翻资料。面试结束后重听录音复盘三件事有没有经常说“嗯”“然后”、停顿过久有没有把“知道”的内容讲成“背诵”的内容有没有回答到一半忘记核心结论。录音复盘很枯燥但比再刷一套题更有用。因为面试本质上是一种口头表达场景只有通过模拟才能改善输出质量。7. 突击排错指南与可复用清单7.1 短期突击最容易踩的三个坑第一个坑是只背不写。很多候选人看HashMap源码觉得“懂了”面试时让手写一个带扩容的数组结构却写不出来。破解办法是每天至少手写三个核心Demo比如用数组实现HashMap简化版、写一个线程池提交任务示例、用JDBC查一张表。第二个坑是计划过满。一天安排Java基础、并发、JVM、MySQL、Spring、算法六个模块结果一项都做不透。短期突击的关键是减法每天主攻一个大主题其他主题只做旧题复述。第三个坑是只输入不输出。看答案复习会产生虚假熟悉感。正确的做法是看完一个知识点合上资料用自己的话讲一遍或者写一篇文章、录一段音频。只有能独立输出面试时才算真正掌握。7.2 一天时间分配模板按14天突击来算可以分成基础期、强化期、模拟期三个阶段。基础期重点是知识框架强化期重点是项目场景题和算法模拟期重点是面试表达。下面是一个可调整的一天模板时间段建议任务7:30-8:30旧题复述把前一天的知识点口头输出9:00-11:30主攻一大主题例如JVM或MySQL14:00-16:00手写代码、跑SQL、看GC日志验证上午所学16:30-18:00项目复盘或场景题整理可追问点20:00-21:30算法题和模拟面试21:30-22:00整理问题卡片标记第二天要复述的内容这里的时间不需要完全照搬但“输入、验证、输出”必须每天都有。7.3 面试前最终检查清单面试前一到两天不要再学新知识而是按清单逐项确认能独立讲清 HashMap 和 ConcurrentHashMap 的区别能画出 JVM 运行时数据区和对象创建流程能说出 G1 和 ZGC 的核心差异能写出标准线程池构造方法并解释拒绝策略能用 explain 分析一条慢SQL能说出 Spring 循环依赖为什么需要三级缓存能说出 Spring 事务失效的常见场景能跑通一个 Spring AI ChatClient 调用示例项目复盘能控制在3分钟内讲完至少完成过两次录音模拟面试。每一项如果做不到就回到对应模块补一次“输出练习”。不要带着“我大概会了”的感觉进面试要带着“我能讲得非常清楚”的自信心态。Java AI岗的短期突击本质上是一次知识压缩和信息组织训练。时间越短越要减少无效收集越要重视输出和复盘。如果今天刚开始准备第一步不是再找资料而是先做一次六题自测找到最薄弱的一项然后用一张问题卡片开始第一轮复述。这个动作坚持一周效果会比零散看十篇资料明显得多。