又到求职季。翻开那份 180 多题的 Java 面试题合集,我再次陷入熟悉的绝望:
- 答案是一坨平铺的要点,背了上句忘下句;
- 就算背下来了,面试官一句"为什么这么设计"就直接破防——因为原答案根本不讲为什么;
- 背没背过全靠感觉,没有任何复习反馈。
市面上的八股文库够多了,缺的不是内容,是背的方法。于是周末两天,我给自己写了个工具:八股自习室。现在开源出来。
核心思路:把每道题拆成"三段式"
每道题在原始答案之外,强制生成三个维度:
| 维度 | 回答的问题 | 面试中的作用 |
|---|---|---|
| 是什么 | 定义与核心结论 | 开口第一句,先给结论 |
| 为什么 | 设计动机、底层原理 | 追问时的深度来源 |
| 怎么做 | 实践要点、代码示例 | 展示工程能力 |
比如「== 和 equals 的区别」,AI 生成的拓展里会有 Integer 缓存池陷阱(127 == 127 为 true、128 为 false)这样的追问预测——这才是面试官真正想聊的。
双轨生成:不配 AI 也能用
- 规则引擎(默认可用):按启发式规则把原答案切进三个维度,零成本零依赖;
- AI 增强(可选):接任意 OpenAI 兼容接口(DeepSeek/Qwen/GLM/Kimi…),批量生成高质量三段式和延伸知识;
- 人工编辑的内容优先级最高,批量生成不会覆盖。
其余功能:全文搜索、基于关键词相似度的库内相关题推荐、掌握度三级标记 + 抽题自测(答题卡式进度)、AI 全库批处理(流式 / 断点续跑)、在线日志查看。
技术栈:Spring Boot 3.3 + Vue 3 + SQLite,最终产物是一个 jar,java -jar 一键启动,数据全部本地化。
踩坑实录(这部分最值钱)
1. Gradle 8.0 × JDK 21 = Unsupported class file major version 65
Spring Boot 3.3 的依赖里带 Java 21 字节码(如 spring-core 的 META-INF/versions/21),Gradle 8.0 构建脚本类加载器读不动。解法:org.gradle.java.home 指向 JDK 17 让 Gradle 本体跑在 17 上,项目字节码目标也定在 17。代价是 Boot 锁死 3.3.x——想升 Boot 得先升 Gradle ≥ 8.5。
2. AI 网关神秘 504
我的中转网关前三次调用全部 504。排查发现模型回复两个字都要 17 秒,长输出必然超过 Cloudflare 的回源超时——错误发生在网关到源站之间,客户端无解。最终方案:换快模型 + SSE 流式请求 + 失败自动重试 ×3,成功率直接拉满。
3. 模型输出的 JSON 里带裸换行
严格 JSON 不允许字符串值里有未转义的控制字符,但大模型经常这么干。Jackson 加 ALLOW_UNESCAPED_CONTROL_CHARS 特性兜底,一次解决。
4.(送分题)Windows 下运行中的 jar 被进程锁定
gradle clean 直接失败。先停服务再构建,或者构建时换个输出目录。
效果
181 题 / 16 分类全部入库,规则引擎保证每道题都有可用的三段式;配上 AI 后,每题约 30 秒生成延伸知识 + 高频追问预测,全库批处理约两小时跑完(断点续跑,中断不重复计费)。
现在它是我每天刷题的主阵地:先自己回忆 → 翻开三段式对照 → 自评记住了/没记住 → 模糊的题更容易被抽到。
开源
GitHub:**github.com/LinYian1/ja…
- Release 页有预构建 jar,下载即用
- 需要:JRE 17+,一个 Markdown 格式的题库文件(仓库不含题库内容,请自备并注意转载授权)
- 可选:任意 OpenAI 兼容 API Key
写这个工具的过程比背八股本身收获更大——事务、并发、缓存这些知识点全在自己代码里踩了一遍。如果对你有用,求个 Star;踩到坑欢迎提 Issue。
下期预告(如果有人看):错题本与遗忘曲线复习排期的实现思路。