技术面试高频问题(Java / 算法 / 数据库)
本章覆盖大厂面试中 Java 集合、算法实现、数据库索引三大高频方向。每一道题都附“考察点 → 回答框架 → 示例回答 → 可能追问 → 避坑提醒”,同时给出各公司侧重点,帮助你在 1 分钟内组织出结构清晰、亮点突出的回答。
面试问答卡片
| 面试问题 | Java 8 中 HashMap 的底层实现原理是什么? |
| 考察点 | 数据结构掌握(数组+链表+红黑树)、哈希冲突解决、扩容机制、线程安全性、版本差异 |
| 回答框架 | ① 整体结构:数组 + 链表 / 红黑树 ② 哈希函数与索引计算 ③ 冲突处理(拉链 → 红黑树) ④ 扩容时机与 resize 过程 ⑤ 线程不安全表现(死循环、数据覆盖) ⑥ 与 ConcurrentHashMap 对比 |
| 示例回答 | “HashMap 在 Java 8 中采用 Node |
| 可能追问 | 为什么转红黑树的阈值是 8?红黑树与链表转换条件?负载因子为什么是 0.75?容量为什么是 2 的幂?ConcurrentHashMap 分段锁怎么实现的? |
| 避坑提醒 | ❌ 只回答“数组+链表”而漏掉红黑树 ❌ 混淆 HashMap 与 HashTable(后者锁全表) ❌ 说不清 rehash 过程 ❌ 忽略 Java 7 头插法与 Java 8 尾插法的区别 |
🎯 公司侧重点 字节跳动 & 阿里:深挖红黑树性能分析、扩容时机优化;腾讯:常结合多线程场景问线程安全替代方案;美团:追问负载因子和幂等扩容设计。
| 面试问题 | 给定一个整数数组和一个目标值,找出两数之和等于目标值的下标(LeetCode 1),请说出几种解法及其复杂度。 |
| 考察点 | 算法思维(暴力、哈希优化、双指针变体)、时间/空间复杂度分析、代码清晰度、边界条件处理 |
| 回答框架 | ① 暴力法 O(n²) → ② 哈希表法 O(n)(一次遍历或两次遍历)→ ③ 如果有序可用双指针 O(n) → ④ 处理重复值、没有解等边界 → ⑤ 对比各自适用场景 |
| 示例回答 | “推荐用一次哈希法:遍历数组,对每个元素检查 target-nums[i] 是否在 map 中,若存在则返回下标;否则将当前元素和下标存入 map。时间 O(n),空间 O(n)。若数组有序,可用双指针 O(n) + O(1)。” (90字) |
| 可能追问 | 如果要求返回所有不重复组合怎么做?如果数组包含负数怎么办?双指针如何保证不重复?如果使用哈希表遇到重复 key 如何处理? |
| 避坑提醒 | ❌ 只给一种解法 ❌ 忘记返回下标而非数值 ❌ 没处理“无解”的情况 ❌ 回答一次遍历时漏掉先查后存的顺序导致误判 |
🎯 公司侧重点 字节、拼多多:手写完整代码并解释哈希表原理;美团、阿里:追问多解比较和空间优化;华为:要求讲清楚索引唯一性及重复元素场景。
| 面试问题 | 哪些情况下会导致 MySQL 索引失效?请列举常见场景并解释原因。 |
| 考察点 | B+ 树原理、最左前缀法则、隐式类型转换、函数操作、不等于/模糊查询优化、索引选择性 |
| 回答框架 | ① 违背最左前缀(联合索引顺序)② 对索引列使用函数(如 DATE()、计算)③ 隐式类型转换(字符串列用数字查询)④ 使用不等于(!= 或 <>)或 NOT IN ⑤ like 以 % 开头 ⑥ 数据库优化器认为全表扫描更快 |
| 示例回答 | “常见失效场景:联合索引跳过了第一列直接查第二列;WHERE 中对列使用函数如 WHERE DATE(create_time)=‘2025-01-01’;隐式转换如 name=123(name 是 varchar);用了 NOT IN 或 !=;like ‘%abc’。” (92字) |
| 可能追问 | 怎样通过 explain 判断索引使用情况?索引下推是什么?如何强制使用索引?如何优化 like 模糊查询?覆盖索引能否解决部分问题? |
| 避坑提醒 | ❌ 只背场景不解释原理 ❌ 忽略最左前缀的“跳跃”失效细节 ❌ 认为 OR 一定会失效(实际上如果OR两边都有索引可能用索引合并) |
🎯 公司侧重点 字节、阿里:结合慢查询日志分析,要求给出优化建议;京东:偏向联合索引设计场景;腾讯:常问索引失效与 explain 输出字段对照。