本轮 AI+Java中级开发面试题库(带答案)
生成时间:2026-05-22 22:01
【面试题】1. 什么是RAG?它解决了大模型的什么问题?
【标准答案】RAG是检索增强生成,核心思路是"先检索、再生成"。它主要解决大模型的两个痛点:一是知识时效性问题,大模型训练后就固化了,不知道新发生的事;二是幻觉问题,让它凭空回答容易编造。RAG的做法是把外部知识向量化存进向量库,用户提问时先检索相关文档片段,把这些片段作为上下文一起喂给大模型,让它基于真实资料回答。这样既保证了知识的可更新性,又大幅减少了胡说八道的情况。实际项目中,我会用LangChain或Spring AI快速搭建RAG pipeline,配合Milvus或Pinecone做向量存储。
【面试题】2. Java中HashMap的扩容机制是怎样的?
【标准答案】HashMap默认初始容量16,负载因子0.75,当元素个数超过容量×负载因子(即12)时触发扩容。扩容时容量翻倍,然后重新计算每个元素在新数组中的位置。JDK1.8做了优化,扩容时元素的新位置要么是原索引,要么是原索引+原容量,利用了扩容后容量是2的幂次方这个特性,避免了重新计算hash。扩容是性能敏感操作,如果预先知道数据量,建议在创建时就指定合适的容量,避免频繁扩容。另外,JDK1.8后链表长度超过8且数组长度超过64时,链表会转成红黑树,提升查询效率。
【面试题】3. 提示词工程中有哪些常用技巧?
【标准答案】常用的有这几招:一是角色设定,让AI扮演专家角色,比如"你是一个资深Java架构师";二是少样本学习,给几个示例让它模仿;三是思维链CoT,让它"一步步思考",把复杂问题拆解;四是结构化输出,指定输出格式如JSON或表格;五是任务分解,把大任务拆成多个小prompt串行或并行执行。实际项目中,我会把这些技巧组合使用,比如先设定角色,再给示例,最后要求结构化输出。还有就是迭代优化,根据输出结果不断调整prompt。
【面试题】4. 说一下JVM的垃圾回收算法有哪些?
【标准答案】主要有四种:标记-清除,先标记存活对象再清除,缺点是会产生内存碎片;标记-整理,标记后把存活对象���到一端,解决了碎片问题但移动成本高;复制算法,把内存分两块,用一块,满了把存活对象复制到另一块,适合新生代但浪费一半空间;分代收集,结合多种算法,新生代用复制(Eden+Survivor),老年代用标记-清除或标记-整理。现在主流的G1和ZGC都是在这些基础上的优化,G1把堆分成多个Region,可以预测停顿时间;ZGC是并发整理,停顿时间控制在10ms以内。
【面试题】5. 什么是AI Agent?它和普通的AI应用有什么区别?
【标准答案】AI Agent是能自主规划、决策、执行任务的智能体,核心特征是"自主性"和"工具使用能力"。普通AI应用是被动响应,你问它答;Agent是主动执行,你给目标,它自己拆解任务、调用工具、迭代优化。举个例子,普通AI回答"帮我订张机票",它只会告诉你怎么订;而Agent会主动去查航班、比价、甚至完成下单。技术栈上,Agent会用到ReAct框架(推理+行动)、记忆系统(短期记忆+长期记忆)、工具调用(搜索、API、数据库查询)。Spring AI和LangChain都提供了Agent开发支持,可以快速构建具备规划、执行、反思能力的智能体。
【面试题】6. Spring Boot的自动装配原理是什么?
【标准答案】Spring Boot自动装配的核心是@SpringBootApplication注解,它里面有个@EnableAutoConfiguration。这个注解会导入AutoConfigurationImportSelector,它会扫描类路径下所有META-INF/spring.factories文件(Spring Boot 2.7后也支持META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports文件),把里面配置的自动配置类加载进来。这些配置类上有@Conditional系列注解,根据条件决定是否生效。比如@ConditionalOnClass检查类路径是否有某个类,@ConditionalOnMissingBean检查容器里是否已有该Bean。这就是为什么引入starter依赖就能自动配置,因为starter里既有依赖jar包又有spring.factories配置。
【面试题】7. 向量数据库的索引类型有哪些?各有什么特点?
【标准答案】向量数据库的索引主要分几类:一是暴力搜索FLAT,精确但慢,适合小数据量;二是IVF倒排索引,先聚类再在每个簇里搜索,速度和精度的平衡选择;三是HNSW图索引,基于可导航小世界图,查询速度快,构建时间长,内存占用高;四是PQ量化索引,压缩向量存储,适合海量数据但精度有损失;五是LSH局部敏感哈希,用哈希函数把相似向量映射到相同桶,速度快但精度不稳定。实际选型时,小数据量用FLAT或HNSW,大数据量用IVF或PQ。Milvus支持多种索引类型,可以根据场景灵活选择。
【面试题】8. MySQL索引失效的场景有哪些?
【标准答案】常见的有:索引列参与运算或函数,比如WHERE YEAR(create_time) = 2024;LIKE以通配符开头,比如LIKE '%abc';OR条件中有一列没索引;索引列使用了NOT、!=、<>等否定操作符;索引列参与类型转换,比如字符串字段用数字比较;复合索引没遵守最左前缀原则;索引列用了IS NULL或IS NOT NULL(视情况而定)。还有就是索引选择性太差,比如性别字段只有两个值,优化器可能觉得全表扫描更快。优化时要养成看执行计划的习惯,用EXPLAIN分析是否真正用上了索引。
【面试题】9. 大模型微调有哪些方法?什么场景需要微调?
【标准答案】微调方法分几类:全量微调,更新所有参数,效果好但成本高;参数高效微调PEFT,只训练少量参数,代表是LoRA和QLoRA;指令微调,用指令-回复对训练,让模型学会遵循指令;RLHF人类反馈强化学习,用人类偏好数据训练奖励模型再优化。需要微调的场景:一是领域适配,让通用模型懂特定行业术语和知识;二是风格定制,让模型输出符合品牌调性;三是任务优化,让模型在特定任务上表现更好。如果���是改变输出格式或增加知识,优先考虑RAG或提示词工程,微调是重武器,成本高,要权衡投入产出。
【面试题】10. Redis分布式锁如何实现?有什么注意事项?
【标准答案】Redis分布式锁通常用SET命令配合NX和EX参数实现:SET lock_key unique_value NX EX 30。NX保证只有不存在时才设置成功,EX设置过期时间防止死锁。释放锁时要用Lua脚本保证原子性:判断锁的值是否等于自己的唯一标识,是则删除,否则不动。这样防止误删别人的锁。注意事项:一是过期时间要合理,太短任务没跑完锁就没了,太长宕机后锁释放慢;二是如果业务要求强一致性,要考虑Redis主从切换导致的锁丢失问题,可以用RedLock算法或换ZooKeeper;三是锁重入问题,同一个线程多次获取同一把锁要支持,可以在value里记计数。实际项目用Redisson库,它封装了这些细节。