上海自研小厂Java开发一面面经(含AI应用考察)
《面试题目》
常规八股
- == 与 equals 的区别
- String、StringBuffer、StringBuilder 的区别
- 数组与链表的区别及各自适用场景
- 栈与队列的区别及各自适用场景
- synchronized 与 ReentrantLock 的区别及底层原理
- git rebase 与 git merge 的区别
场景题
- 项目缓存挂了,如何快速恢复
- pay_service 挂了之后的兜底方案是什么
- 某方法逻辑过长,如何进行拆分
AI 应用考察
- ReAct 是什么(推理和行动)
- 追问:ReAct 的终止信号是什么
- 如何调用 tools
- tools 调用失败了怎么办
- KVCache 是什么
手写题(可使用自己熟悉的 IDE)
- 手写单例模式
- LeetCode 20:有效的括号(HashMap + Stack)
《参考解析》
String/StringBuffer/StringBuilder 区别
String 不可变(final char[]),拼接每次产生新对象,适合常量字符串;StringBuffer 可变且线程安全(方法加 synchronized),适合多线程场景;StringBuilder 可变非线程安全但性能最高,单线程字符串拼接首选。
ReAct 框架
ReAct(Reasoning + Acting)让 LLM 交替输出「思考(Thought)→ 行动(Action)→ 观察(Observation)」循环。终止信号是 LLM 生成 Finish[answer] 动作,或达到最大迭代次数上限;框架捕获该信号后停止循环并返回最终答案。
KVCache 大模型自回归推理时,Transformer 每步都需要计算所有历史 token 的 Key/Value 注意力向量。KVCache 将已计算的 K/V 矩阵缓存在显存中,生成新 token 时直接复用,避免重复计算,可大幅降低推理延迟(从 O(n²) 降至 O(n) 每步)。
缓存宕机恢复 ① 重启 Redis 并检查 RDB/AOF 持久化文件是否完整,优先从 AOF 恢复数据;② 启动缓存预热脚本批量加载热点数据(防止冷启动缓存雪崩);③ 恢复前对数据库层限流降级,拒绝超出容量的请求直接返回兜底数据。
单例模式(双重检查锁)
public class Singleton {
private static volatile Singleton instance;
private Singleton() {}
public static Singleton getInstance() {
if (instance == null) {
synchronized (Singleton.class) {
if (instance == null) {
instance = new Singleton();
}
}
}
return instance;
}
}
volatile 防止指令重排序导致返回未初始化完成的对象。