深势科技 Java 开发面试经验
面试题目
一面
- volatile原理
- ThreadLocal原理
- Mysql中的事务隔离级别
- 可重复读和读已提交区别
- 可重复读可以解决幻觉问题吗
- 手撕:三数之和
二面
一、 Agent 项目与大模型相关
- 做的智能运维 Agent 平台主要是采用了 Spring AI 是吧?
- 有没有了解过 Spring AI Alibaba 这个框架?
- 用 Spring AI 的话,你是怎么着编排这个 Agent 的?
- 还构建了一个 RAG 知识库是吧?这个知识库里面它主要存的这些是文本数据吗?
- 那你是做这个文本的话,是怎么对它做切分的?
- 做向量化使用的是哪个模型?
- 有没有做 Rerank 重排序?
- 检索的时候对这个文本直接是做了向量化去检索的,是吧?
- 那你这个长期的记忆你是怎么来去处理的?什么样子的数据,你会把它当做长期的记忆?
- 在做这个智能运维 Agent 平台的时候,为什么没考虑用一下 LangChain4j?
- 有没有关注一下这个 Agent Skill?有没有自己去写一下,然后让模型调用一下这个 Skill?
- 在学习或者是实习当中,有没有用一些 AI 编程工具?
二、 实习经历
- 实习当中用到了 Kafka,那他们为什么用 Kafka 而不是用其他的队列,这个有了解吗?
三、 中间件与数据库
- 有了解过 ES (Elasticsearch) 这个数据库吗?
- 有没有了解过分库分表的一些机制?
- Redis 中有个 ZSet 类型,这个了解吗?
- 假设我要用 ZSet 类型做一个排行榜,但是如果两个人的分数相同,我就要用时间做先后顺序的排序。那我怎么来设计这个存储呢?
- 具体它怎么存呢?因为 score 是存了一个数字,你怎么样把它设计一下完成排序?
- 你知道 Redis 原生机制实现分布式锁会有哪些问题吗?
- 假设用普通方式实现分布式锁,我的一个任务在执行当中还没有执行完,他就把锁释放了。那我怎么样能保证这个任务执行完了才释放锁?
- 除了了解 Kafka,有没有看过 RocketMQ
- MySQL 这块,假设我要去执行一个 update 语句更新数据,比如用 name 去更新,但是这个 name 我没建索引,它会锁表吗?
四、 Java 基础与算法
- Java 这一块一般用的是 JDK 哪个版本?对 JDK 21/25 有没有过了解?
- 虚拟线程对 Java 开发有哪些帮助?IO 密集型和 CPU 密集型任务都能提高并发吗?
- 算法题:最小栈
参考解析
- Redis ZSet实现分数相同排序:可以将 score 设计为
分数 + (MAX_TIME - 当前时间戳) / MAX_TIME的组合。利用浮点数精度,整数位代表分数,小数位代表时间倒序,从而实现多维度排序。 - MySQL无索引Update锁表:InnoDB存储引擎在执行 update 时,如果查询条件没有索引,会触发全表扫描,进而导致锁住整张表(隐式加行锁变成表锁)。建议线上生产环境必须加索引。
- 分布式锁过期提前释放:采用“锁续期”机制(如Redisson的看门狗watchdog),在任务执行过程中定期延长锁的有效期。也可以通过执行任务前预估时长,设置合理的过期时间。
- 虚拟线程适用场景:虚拟线程在 IO 密集型任务中表现优秀,因其能有效减少线程切换开销并处理大量阻塞 IO。在计算密集型任务中,虚拟线程无法提升性能,甚至可能因过度切换导致上下文切换开销增加。