学习自测题库:24 题与完整解析
这里完整列出 24 道原创单选题与解析。正文在构建时生成,关闭 JavaScript 也能阅读。先写下自己的选择,再对照答案,最后完成每题的下一步任务。
进入交互式学习工作台 · 题库版本:2026-11-06。每组 6 题。
题设中的代码、数量和故障时序用于学习判断,不代表本站或使用者的实际运行结果。固定题的作答不能预测就业或面试通过。实践任务需要你亲自执行,并保留真实记录。
题目目录
- Java 基础:把语言规则写成可运行的小例子,保留实际输出。
- 并发与事务:画出执行时序,再用受控的并发或回滚验证边界。
- AI 检索:固定文档与题集,逐题检查证据、版本和权限。
- 项目表达:整理个人职责、实现和可复查材料,明确尚未验证的部分。
Java 基础
把语言规则写成可运行的小例子,保留实际输出。
1. 字符串内容与引用
题目: 下面的两个判断分别输出什么?
String a = new String("java");
String b = new String("java");
System.out.println(a == b);
System.out.println(a.equals(b));- A. true、true
- B. false、true
- C. true、false
- D. false、false
正确答案:B. false、true
解释: new String 创建新的 String 对象。两个引用的 == 判断对象身份,equals 判断字符串内容,所以依次为 false、true;不要把字符串常量池的示例直接套到显式 new 上。
适用版本与边界: Java SE 8—21;按 Java SE 21 语言规范核对。
进一步阅读:
可执行的下一步: 在本机创建 StringCheck.java,分别运行 new String 与字符串字面量两组比较,保存代码、JDK 版本和真实输出。
2. 相等对象的哈希约束
题目: 自定义 Key 覆写 equals,使业务编号相同的实例相等,却沿用 Object.hashCode。要使它可靠地用作 HashMap 的键,应做什么?
- A. 只把 HashMap 换成容量更大的
- B. 删除 equals,保留业务相等语义
- C. 按相同业务编号实现 hashCode,并保持键参与相等判断的字段稳定
- D. 在 get 前手动触发 GC
正确答案:C. 按相同业务编号实现 hashCode,并保持键参与相等判断的字段稳定
解释: equals 相等的对象必须有相同的 hashCode。哈希表先依据哈希定位,再比较键;还要避免入表后修改参与 equals/hashCode 的字段。扩容不能修复契约错误。
适用版本与边界: Java SE 8—21,Object/HashMap 契约;本题假设业务编号定义相等性。
进一步阅读:
可执行的下一步: 用两个编号相同的 Key 执行 put/get,补齐 equals/hashCode 后再次运行,并增加一次入表后改编号的反例。
3. 参数传递
题目: 执行下面的代码,调用方 xs 的内容是什么?
static void change(List<String> p) {
p.add("B");
p = new ArrayList<>(Arrays.asList("C"));
}
List<String> xs = new ArrayList<>(Arrays.asList("A"));
change(xs);
System.out.println(xs);- A. [A]
- B. [A, B]
- C. [C]
- D. 编译失败
正确答案:B. [A, B]
解释: Java 按值传递;此处传入的是引用值的副本。p.add 改变同一个列表对象;给局部变量 p 重新赋值不改变调用方 xs 的指向,结果为 [A, B]。
适用版本与边界: Java SE 8—21;java.util.ArrayList/Arrays。
进一步阅读:
可执行的下一步: 将代码补进 main,打印调用前后列表;再写一个返回新列表的方法,由调用方显式接收返回值。
4. finally 改写返回值
题目: 下面的方法返回什么?
static int value() {
try { return 1; }
finally { return 2; }
}- A. 1
- B. 2
- C. 先返回 1,再返回 2
- D. 必然抛出异常
正确答案:B. 2
解释: try 的 return 先产生待返回值,但 finally 仍会执行。finally 的 return 使原来的返回过程被替代,结果为 2;这种写法也可能掩盖异常,应避免。
适用版本与边界: Java SE 8—21,JLS 14.20.2 的 try-finally 完成规则。
进一步阅读:
可执行的下一步: 运行原例,再删除 finally 中的 return 对比结果;把 try 改为抛出异常,观察 finally 返回如何掩盖它。
5. 固定长度列表
题目: Arrays.asList("A", "B") 返回的列表,哪项操作在本题条件下可以正常执行?
- A. add("C")
- B. remove(0)
- C. clear()
- D. set(0, "C")
正确答案:D. set(0, "C")
解释: Arrays.asList 返回由数组支持的固定长度列表,允许 set 替换元素,不支持改变长度的 add/remove/clear。本题列表非空;需要增删时用 new ArrayList<>(原列表)。
适用版本与边界: Java SE 8—21,Arrays.asList;不等同于 Java 9+ 的 List.of。
进一步阅读:
可执行的下一步: 分别运行 set 和 add 并记录异常类型;再复制成 ArrayList 验证可增删,避免仅凭类名猜测能力。
6. GC 请求不是完成证明
题目: 执行 System.gc() 后,只根据下一行日志,能确定什么?
- A. 所有不可达对象均已回收
- B. 发生过一次完整的 Full GC
- C. 发出了尽力执行垃圾回收的请求,不能据此确认具体对象已回收
- D. 所有软引用均已清空
正确答案:C. 发出了尽力执行垃圾回收的请求,不能据此确认具体对象已回收
解释: System.gc() 是请求,API 不保证回收某个对象、回收数量或完成时间;JVM 也可能配置为忽略显式请求。判断回收行为应结合实际 JVM 配置、GC 日志和可观测数据。
适用版本与边界: Java SE 8—21;具体收集器行为和参数依 JVM 实现。
进一步阅读:
可执行的下一步: 在 JDK 21 用 -Xlog:gc 运行最小分配示例,记录 JVM 参数和实际 GC 日志;把请求时刻与日志事件分开描述。
并发与事务
画出执行时序,再用受控的并发或回滚验证边界。
7. volatile 与复合操作
题目: 两个线程同时对 volatile int n 执行 n++,各执行 1000 次并 join。哪项判断成立?
- A. 最终一定是 2000
- B. volatile 保证可见性,但不使 n++ 整体原子化
- C. join 会补回丢失的递增
- D. 把 n 改为 long 就能保证原子递增
正确答案:B. volatile 保证可见性,但不使 n++ 整体原子化
解释: n++ 包含读、加、写,线程可能读取相同旧值而覆盖更新;volatile 不把整段操作变为原子操作。join 保证等待线程结束,不修复丢失更新。可使用 AtomicInteger.incrementAndGet 或共同锁保护。
适用版本与边界: Java SE 8—21,Java 内存模型;无其他同步保护的 n++。
进一步阅读:
可执行的下一步: 用 CountDownLatch 同时启动两个递增线程并多次运行,再替换为 AtomicInteger;某次恰好得到 2000 也不能证明原代码正确。
8. 线程池先排队还是扩容
题目: 运行中的 ThreadPoolExecutor:core=2、max=4、有界队列容量=2。两个工作线程均被门闩阻塞,队列为空;此时再提交一个任务,且没有关闭和其他并发提交。会怎样?
- A. 先创建第 3 个工作线程
- B. 立即拒绝
- C. 先进入队列
- D. 由提交线程立即执行
正确答案:C. 先进入队列
解释: 工作线程达到 core 后优先尝试入队,入队失败才尝试扩容到 max。本题队列有空位,因此第三个任务先排队;max=4 不代表每次都立即扩容到 4。
适用版本与边界: JDK 21 ThreadPoolExecutor.execute;题设排除关闭和提交竞态。
进一步阅读:
可执行的下一步: 用门闩阻塞两个核心线程,逐个提交任务,记录 poolSize、queue.size 与拒绝时刻;结束时释放门闩并关闭线程池。
9. CallerRunsPolicy 的执行位置
题目: 线程池已饱和但未关闭,使用 CallerRunsPolicy。HTTP 请求线程调用 execute 提交任务,且没有自定义策略。任务由谁执行?
- A. HTTP 提交线程
- B. 一个必定新建的线程
- C. JVM 的 GC 线程
- D. 任务必定被丢弃
正确答案:A. HTTP 提交线程
解释: CallerRunsPolicy 在池未关闭时让调用 execute 的线程运行任务。这能减慢提交速度,也会占用 HTTP 请求线程,不能视为无成本的过载保护。池已关闭时该策略不运行任务。
适用版本与边界: JDK 21 ThreadPoolExecutor.CallerRunsPolicy;线程池饱和且未关闭。
进一步阅读:
可执行的下一步: 在任务和请求入口打印线程名,复现饱和路径;再单独测试 shutdown 后提交,记录两条路径的差异。
10. Spring 同类调用边界
题目: Spring 默认代理模式,无既有事务。普通方法通过 this.save() 调用同一个 Bean 上标有 @Transactional 的 save。只靠这个注解,事务会新生效吗?
- A. 一定会
- B. 只要 save 是 public 就一定会
- C. 换成 RuntimeException 才会
- D. 不会,调用未经过事务代理
正确答案:D. 不会,调用未经过事务代理
解释: 默认代理模式只拦截经过代理的外部方法调用;this.save() 的自调用绕过代理,注解不能新建事务。若已有事务则是另一种题设;AspectJ 模式也需单独讨论。
适用版本与边界: Spring Framework 6.2、默认 proxy 模式、无外层事务;不讨论 AspectJ。
进一步阅读:
可执行的下一步: 把事务入口移到另一个 Bean 并经注入代理调用;写集成测试在写入后抛异常,用独立查询核对是否回滚。
11. 提交后事件的崩溃窗口
题目: 订单已提交,进程在 AFTER_COMMIT 监听器发送消息前崩溃。要使重启后仍能恢复投递,哪项方案针对这个窗口有效?
- A. 只把监听器改名
- B. 订单与 outbox 待办同库同事务保存,提交后由扫描器重试,接收方幂等
- C. 把内存队列容量翻倍
- D. 仅在日志中输出发送成功
正确答案:B. 订单与 outbox 待办同库同事务保存,提交后由扫描器重试,接收方幂等
解释: 内存中的提交后事件不能跨进程崩溃恢复。同库同事务的 outbox 将业务变更和投递意图一起提交,后台可重新扫描。发送成功但确认前崩溃仍可能重发,因此接收方需要幂等。
适用版本与边界: Spring Framework 6.2、JDBC 本地事务;订单与 outbox 使用同库及同一事务管理器。
进一步阅读:
可执行的下一步: 设计两次故障注入:提交后未发送、发送后未确认。重启扫描器,检查最终投递及重复消息处理记录。
12. 写后删除仍有竞态
题目: 读请求 R 已从数据库取到旧值,暂停在回填前;写请求 W 提交新值并删除缓存;R 再回填旧值。哪项判断正确?
- A. 成功删除一次就消除了全部竞态
- B. Redis 单线程可阻止这个跨数据库时序
- C. 缓存可能重新出现旧值,需要按业务设计 TTL、版本校验或补偿
- D. 把删除放到数据库提交前就总能解决
正确答案:C. 缓存可能重新出现旧值,需要按业务设计 TTL、版本校验或补偿
解释: 缓存命令串行执行不能让数据库读取、提交与回填成为一个原子操作。本题时序能在删除成功后重新写入旧值。TTL 限制陈旧时长,版本检查和补偿需有明确实现与验证,不能宣称天然强一致。
适用版本与边界: Cache-Aside,Redis 6/7 与独立关系型数据库;未使用跨资源原子协议。
进一步阅读:
可执行的下一步: 用两个门闩复现 R 读旧值、W 提交删除、R 回填的顺序,记录观察窗口,再验证你选择的修复方案。
AI 检索
固定文档与题集,逐题检查证据、版本和权限。
13. 检索命中率的分母
题目: 10 个有答案且有权限的问题中,8 个的前 5 个片段命中至少一个参考片段;另有 2 个无答案题。本题定义的 Hit@5 是多少?
- A. 8/12
- B. 10/12
- C. 8/10
- D. 只看生成答案,无法计算
正确答案:C. 8/10
解释: 按题设,Hit@5 的分母是有答案且有权限的 10 题,分子是命中的 8 题,结果为 80%。无答案题应单独评价拒答;命中一个片段也不代表多段证据充分或答案必然正确。
适用版本与边界: 与框架无关的离线 RAG 评估;口径采用本站 RAG 评估指南,题设数字仅为计算示例。
进一步阅读:
可执行的下一步: 为自己的题集增加 hasAnswer、authorized 和 referenceChunkIds,分别列出检索命中与拒答结果,保留每题分母归属。
14. 权限过滤的位置
题目: 员工只能读部门 A 文档。检索服务把部门 B 的片段发送给模型后,才在浏览器隐藏引用。权限控制完成了吗?
- A. 完成,用户看不到引用即可
- B. 没有,服务端应让未授权内容不进入检索结果和模型上下文,并检查响应与日志
- C. 完成,只要在提示词写保密
- D. 只需降低 temperature
正确答案:B. 没有,服务端应让未授权内容不进入检索结果和模型上下文,并检查响应与日志
解释: 隐藏界面不能撤回已经发送给模型的数据。权限身份应来自可信服务端上下文,并约束检索、上下文、缓存和输出。提示词不能替代业务授权;验收还要检查日志及缓存键是否混用身份。
适用版本与边界: RAG 通用权限边界;Spring AI 1.x 接入时须核对实际版本的过滤接口。
进一步阅读:
可执行的下一步: 为同一问题配置 A/B 两种测试身份,保存召回片段 ID 与模型上下文,验证越权片段没有进入对应链路。
15. 删除文档后的验收
题目: 知识库删除接口返回成功,但旧分块、回答缓存和历史引用都未检查。能据此认定在线问答不再暴露该文档吗?
- A. 能,HTTP 200 证明所有链路已清理
- B. 能,只要删除文件名
- C. 能,等模型自行遗忘即可
- D. 不能,需要检查旧分块、缓存和引用的实际可达性与删除传播
正确答案:D. 不能,需要检查旧分块、缓存和引用的实际可达性与删除传播
解释: 文件删除成功只说明某个步骤完成。旧版本分块可能仍在索引中,缓存也可能继续返回旧答案;应按文档 ID、版本和权限检查检索、上下文及引用,并定义传播窗口。
适用版本与边界: 带向量索引和回答缓存的 RAG;删除 API 的语义按实际实现核对。
进一步阅读:
可执行的下一步: 先准备能命中旧文档的问题,记录分块 ID;执行删除后重复检索、缓存命中与引用访问,记录残留及清理时间。
16. 评估集的近似问法泄漏
题目: 同一问题的五个近似改写被随机拆到调试集与保留集,然后反复根据保留集结果改提示词。更合理的处理是什么?
- A. 把近似问题按组划分,停止用保留集调参;被用来调参的保留题不能继续当独立验证
- B. 只改文件名,保留同样拆分
- C. 删除所有失败题
- D. 把调试集和保留集的结果直接相加
正确答案:A. 把近似问题按组划分,停止用保留集调参;被用来调参的保留题不能继续当独立验证
解释: 近似改写共享语义,分散到两组容易泄漏。按问题族分组可减少重叠;保留集一旦参与调参,就失去独立性,应补充新的独立样本并标注数据与配置版本。
适用版本与边界: 离线 RAG 评估方法,适用于不同模型和框架;不作线上效果保证。
进一步阅读:
可执行的下一步: 为每题增加 familyId,按 familyId 划分集合并检查交集;保留调参记录,新增一批未看过结果的验收题。
17. 有引用不等于有依据
题目: 答案带了一个真实存在的引用,但片段没有提到答案中的退款期限。哪项结论成立?
- A. 引用存在,所以退款期限已被证实
- B. 相似度高就能证实期限
- C. 引用存在不证明该事实被支持,需要逐项核对证据,缺失时说明证据不足
- D. 只要回答流畅就可通过
正确答案:C. 引用存在不证明该事实被支持,需要逐项核对证据,缺失时说明证据不足
解释: 引用有效性和事实支撑是不同检查。片段可访问仍可能不支持答案中的具体期限;应核对事实、版本及授权,对证据不足的问题补检或拒答,而非补造规则。
适用版本与边界: RAG 通用事实核对;本题不假定特定模型或向量数据库。
进一步阅读:
可执行的下一步: 取一个回答,把事实陈述逐句列成表,给每句对应原文片段和版本;无依据的句子单独列为失败项。
18. 模型工具调用与授权
题目: 模型生成了符合 JSON Schema 的关闭工单参数,工单属于其他租户。服务端下一步应怎样做?
- A. 立即执行,Schema 已保证权限
- B. 使用可信登录身份检查租户及对象权限,不通过就拒绝执行
- C. 让模型再说一次确认即可
- D. 直接相信参数中的 tenantId
正确答案:B. 使用可信登录身份检查租户及对象权限,不通过就拒绝执行
解释: Schema 约束结构,不能证明调用者有权操作该对象。服务端应从可信会话取得身份,核对对象归属、业务状态和操作权限;确认、幂等与审计也需由业务层落实。
适用版本与边界: 模型工具调用的通用服务端边界;不依赖特定 function calling API。
进一步阅读:
可执行的下一步: 为工具处理器增加跨租户请求测试,核对拒绝结果和数据库无变更;再测试同一幂等键重复请求。
项目表达
整理个人职责、实现和可复查材料,明确尚未验证的部分。
19. 哪些内容可写成个人成果
题目: 下面哪个表述只报告了题设已提供的可核对事实?
- A. 看过架构图,就写负责整套系统
- B. 教程介绍日活百万,所以写我的项目日活百万
- C. 未做压测,但写吞吐提升十倍
- D. 独立实现了练习项目的文档删除接口,附提交、删除用例及本地运行记录,并注明未上线
正确答案:D. 独立实现了练习项目的文档删除接口,附提交、删除用例及本地运行记录,并注明未上线
解释: 最后一项对应明确职责、产物、验证条件和部署边界。阅读教程不能证明个人负责系统,项目介绍的规模不能变成个人业绩,未经测试不能填写提升比例。
适用版本与边界: 项目与简历证据规范,适用于 2026 年本轮材料;非招聘评价标准。
进一步阅读:
可执行的下一步: 选一条自己的简历描述,逐项标注本人职责、代码或文档位置、实际验证和未完成边界;删掉无证据数字。
20. 性能数字的比较条件
题目: 两次耗时记录分别来自不同机器、不同题集,且一次排除了失败请求。能据此报告“优化后 P95 降低 40%”吗?
- A. 能,数字更小即可
- B. 不能,应统一对照条件并记录样本数、失败率及统计口径,再据实比较
- C. 只要换算成平均数就能
- D. 删掉慢请求即可
正确答案:B. 不能,应统一对照条件并记录样本数、失败率及统计口径,再据实比较
解释: 机器、负载、数据、配置及失败过滤差异会改变分布。要归因于优化,应控制条件并报告成功耗时的口径、样本数和失败率;未经这样的验证,题设不能支持 40% 的改善结论。
适用版本与边界: HTTP/检索链路的对照测量原则;无预设性能结果。
进一步阅读:
可执行的下一步: 写一份固定环境、题集、并发、预热、配置版本和失败处理方式的运行说明,保存两轮原始记录后再计算比较。
21. 数据不足时如何选项目
题目: 准备做企业知识库,但目前没有授权企业文档。哪项计划可以立即执行且边界明确?
- A. 用公开可用且许可允许的资料构建小范围检索练习,注明数据来源与未接入生产
- B. 编造一套真实企业客户数据
- C. 直接写已经服务多家企业
- D. 先承诺准确率 99% 再找数据
正确答案:A. 用公开可用且许可允许的资料构建小范围检索练习,注明数据来源与未接入生产
解释: 小范围、许可清晰且可获得的数据能支撑真实实现与验收。练习应明确数据及部署边界,不把合成或公开材料包装成生产客户结果,也不在评估前承诺准确率。
适用版本与边界: Java AI 项目范围规划;数据许可按所选资料单独核对。
进一步阅读:
可执行的下一步: 写一页项目范围:数据来源及许可、用户问题、Java 业务入口、AI 能力边界和最小验收,先实现其中一个闭环。
22. 故障描述需要什么材料
题目: 要说明“重复请求未重复扣减库存”,下面哪组材料最能直接支持这个具体结论?
- A. 一张服务启动截图
- B. 依赖清单含 Redis 和 MySQL
- C. 两次使用同一业务幂等键的请求、对应响应、事务及库存变更记录,并标注环境
- D. 只展示接口返回 200
正确答案:C. 两次使用同一业务幂等键的请求、对应响应、事务及库存变更记录,并标注环境
解释: 要证明重复请求的业务效果,需要把相同幂等键、请求、响应和实际数据变化串起来。组件名字或启动成功不证明幂等。结论仍限于已测场景;并发和崩溃路径要另测。
适用版本与边界: Java 后端项目验证;具体事务及幂等实现依实际数据库与框架。
进一步阅读:
可执行的下一步: 保存一组连续重复请求和一组并发重复请求,核对库存只变化一次;再明确尚未覆盖的故障窗口。
23. 检索与微调的能力边界
题目: 项目只实现了文档切分、向量检索和把片段加入提示词,没有任何训练作业。哪项描述符合已实现内容?
- A. 完成了基础模型预训练
- B. 完成了模型微调
- C. 训练了企业专属大模型
- D. 实现了 RAG 检索增强链路;没有更新模型权重的证据
正确答案:D. 实现了 RAG 检索增强链路;没有更新模型权重的证据
解释: 将外部文档检索后加入上下文属于检索增强,不等于更新模型权重。没有训练作业、训练配置和权重产物,不应把 RAG 写成微调或预训练。
适用版本与边界: RAG 与训练的能力边界;模型供应商与框架无关。
进一步阅读:
可执行的下一步: 画出入库与在线问答两条链路,逐段对应代码;在简历中用实际实现的能力名称替换夸大的训练表述。
24. 自测结果应如何使用
题目: 24 道固定题全部答对后,下面哪项下一步合理?
- A. 直接认定面试必过
- B. 选择一个仍缺实践证据的主题,执行下一步任务并整理真实记录
- C. 生成一个就业概率
- D. 把题目答对数写成线上项目成果
正确答案:B. 选择一个仍缺实践证据的主题,执行下一步任务并整理真实记录
解释: 固定题只能反馈这些题的作答情况,不能预测就业或面试结果。把解析中的知识落实为代码、时序图、回放记录和职责说明,才能补充可复查的学习材料。
适用版本与边界: 本工具 2026-11-06 题库;统计只描述当前题库内的作答。
进一步阅读:
可执行的下一步: 从错题或尚无实践记录的主题挑一项,完成其具体任务;在复习单写下文件位置、实际现象与仍未解决的问题。
规则核对与后续学习
语言与 API 规则可核对 Java SE 21 语言规范、Java SE 21 API;线程池规则见 ThreadPoolExecutor API。Spring 题设采用 Spring Framework 6.2 事务文档。题设有明确版本限制时,按该限制复现。
工程题的具体判断口径见每题链接的站内指南。先完成一个代码例子、故障回放或证据表,再回到 学习工作台 保存自己的实践记录,或直接在自己的文档中整理。
