大健云仓Java开发一面凉经

大健云仓 · Java开发工程师 · 一面 · 2026-05

《面试题目》

  1. MySQL 回表查询是什么?慢查询优化方案?
  2. 一个事务中分别操作订单、物流、第三方服务,为什么会导致锁表?怎么优化?
  3. Spring 事务传播机制
  4. Java ArrayList 和 HashSet 的 contains 方法时间复杂度
  5. JVM 的内存模型
  6. 介绍你知道的垃圾回收器

《参考解析》

  1. MySQL 回表查询:使用二级索引查询时,如果 SELECT 的字段不在该索引中,需要先通过二级索引找到主键值,再拿主键值去聚簇索引中查找完整行数据,这个”二次查找”的过程叫回表;避免回表的方式是使用覆盖索引(SELECT 的字段全部包含在索引中)。
  2. 跨表事务导致锁表的原因:一个事务内先后操作订单、物流、第三方服务对应的多张表,如果加锁顺序不一致或事务持有时间过长(比如中间调用了耗时的第三方接口),容易导致行锁/表锁长时间占用,与其他并发事务产生锁等待甚至死锁;优化方式包括缩短事务边界(把非数据库操作如调用第三方接口移出事务)、统一多表加锁顺序、必要时拆分为多个短事务配合最终一致性方案(如MQ补偿)。
  3. ArrayList vs HashSet 的 contains 复杂度:ArrayList 的 contains 底层是遍历数组逐个比较,时间复杂度 O(n);HashSet 的 contains 基于哈希表实现,先计算 hashCode 定位桶再比较,平均时间复杂度 O(1)(最坏情况哈希冲突退化为 O(n),JDK8后链表过长会树化为 O(log n))。
  4. JVM 内存模型:分为堆(Heap,存放对象实例,分新生代/老年代)、方法区/元空间(存放类信息、常量、静态变量)、虚拟机栈(每个线程私有,存放局部变量表、操作数栈等栈帧信息)、本地方法栈(为 Native 方法服务)、程序计数器(记录当前线程执行的字节码指令地址)。