元启视界 Java 开发春招一面
面试题目
Java 基础
- HashMap 的 put 流程是怎样的?
- HashMap 扩容机制是怎样的?
- 负载因子是什么?扩容的时机是什么?
实习 / 项目
- 实习经历拷打(约 30 分钟)
- 实习或项目中遇到的技术难点,如何解决?
MySQL
ORDER BY + LIMIT为什么可能返回重复数据?- 索引优化相关问题
其他
- AI 工具使用情况
- 反问环节
参考解析
HashMap 的 put 流程
- 计算 key 的
hash值,定位桶位置((n-1) & hash)。 - 若桶为空,直接插入;若存在哈希冲突,遍历链表/红黑树,key 相同则覆盖,否则尾插。
- 链表长度 ≥ 8 且数组长度 ≥ 64 时,链表转红黑树。
- 插入后判断是否超过阈值(
capacity × loadFactor),超过则扩容。
HashMap 扩容机制
- 扩容时容量翻倍(
newCap = oldCap << 1),重新分配桶数组。 - JDK 8 优化:元素要么留在原位,要么移动到
原索引 + oldCap处,避免重新计算 hash。 - 扩容是 O(n) 操作,高并发下多线程扩容会有线程安全问题(建议用
ConcurrentHashMap)。
负载因子与扩容时机
- 默认负载因子为 0.75,是时间与空间的折中值。
- 扩容阈值
threshold = capacity × loadFactor,元素数量超过 threshold 时触发扩容。 - 负载因子越小,冲突少但空间浪费;越大,空间利用率高但冲突增多、性能下降。
ORDER BY + LIMIT 返回重复数据
- 原因:当
ORDER BY的排序字段存在相同值时,数据库排序结果不稳定(MySQL 优化器可能每次选择不同的执行计划或行顺序)。 - 分页时不同页可能拿到同一行,也可能漏掉某行。
- 解决方案:在
ORDER BY中追加唯一字段(如主键id)作为次级排序条件,保证排序稳定性,例如ORDER BY create_time, id LIMIT 10。
索引优化常见考点
- 遵循最左前缀原则,联合索引需按顺序使用。
- 避免在索引列上使用函数、隐式类型转换,否则索引失效。
- 区分度低的列(如性别)不适合单独建索引。
- 使用
EXPLAIN分析执行计划,关注type(最好达到ref或range)、key、rows等字段。 - 覆盖索引可避免回表,提升查询性能。