技术面试高频问题(Java / 算法 / 数据库)

本章覆盖大厂面试中 Java 集合、算法实现、数据库索引三大高频方向。每一道题都附“考察点 → 回答框架 → 示例回答 → 可能追问 → 避坑提醒”,同时给出各公司侧重点,帮助你在 1 分钟内组织出结构清晰、亮点突出的回答。

识别问题核心 梳理知识脉络 构建回答结构 突出关键细节 主动引导追问 闭环式结构

面试问答卡片

面试问题 Java 8 中 HashMap 的底层实现原理是什么?
考察点 数据结构掌握(数组+链表+红黑树)、哈希冲突解决、扩容机制、线程安全性、版本差异
回答框架 ① 整体结构:数组 + 链表 / 红黑树 ② 哈希函数与索引计算 ③ 冲突处理(拉链 → 红黑树) ④ 扩容时机与 resize 过程 ⑤ 线程不安全表现(死循环、数据覆盖) ⑥ 与 ConcurrentHashMap 对比
示例回答 “HashMap 在 Java 8 中采用 Node[] table 作为哈希桶,通过 (n-1)&hash 定位。当链表长度 ≥8 且数组长度 ≥64 时转为红黑树。默认负载因子 0.75,每次扩容为原容量 2 倍并 rehash。线程不安全,多线程 put 可能导致死循环或摸丢失。” (85字)
可能追问 为什么转红黑树的阈值是 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 输出字段对照。