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