Java 面试核心基础
本文聚焦于 Java 面试中决定生死的基础能力,不讲花活。
对 Java 面试中的基础薄弱问题,梳理了高频考点。涵盖 HashMap 数据结构演变、并发工具类、JVM 内存模型及垃圾回收机制、String 不可变性原理以及集合框架规范。强调理解底层设计思想而非仅会用框架,建议通过阅读源码和结构化表达提升面试表现,帮助开发者夯实基础以应对技术考核。

本文聚焦于 Java 面试中决定生死的基础能力,不讲花活。
你可能:
但当面试官问出下面这些问题时,你还能从容应对吗?
❓ HashMap 在 JDK 1.8 之后为什么引入红黑树? ❓ volatile 到底保证了什么?它和 synchronized 的区别是什么? ❓ 线程池为什么不允许用 Executors 创建? ❓ MySQL 的 MVCC 是怎么实现的? ❓ JVM 内存模型是怎样的?GC 如何工作?
如果你开始:
那一刻,胜负已分。
企业要的不是只会用框架的'API 工程师'。 框架更新换代快,但底层原理十年不变。
企业真正想要的是:
而这些能力的根基,全部来自 Java 基础。
高频问题:
标准回答思路(结构化表达):
| 版本 | 数据结构 | 插入方式 | 并发问题 |
|---|---|---|---|
| 1.7 | 数组 + 链表 | 头插法 | 扩容时可能形成环形链表,导致死循环 |
| 1.8 | 数组 + 链表 + 红黑树 | 尾插法 | 改用尾插法,避免死循环,但仍有数据丢失等问题 |
树化条件:
退化条件:
为什么树化阈值是 8?
💡 本质: 用红黑树的 O(log n) 查找性能,替代链表 O(n) 查找,优化极端哈希碰撞场景。
count++ 仍然不是线程安全的。| 维度 | synchronized | ReentrantLock |
|---|---|---|
| 实现层级 | JVM 层面(Monitor 机制) | JDK 层面(AQS 实现) |
| 锁获取方式 | 自动获取/释放 | 需手动 lock/unlock(通常配合 finally) |
| 可中断 | ❌ | ✅ |
| 公平锁 | ❌(非公平) | ✅ 可指定公平或非公平 |
| 多个条件 | ❌(只能一个 wait set) | ✅ 可绑定多个 Condition |
| 锁状态 | 无法判断 | 可调用 isLocked() 等方法判断 |
使用建议:
Executors 返回的线程池存在隐患:
Executors.newFixedThreadPool(5); // 内部使用 LinkedBlockingQueue,队列无界 → 任务堆积 → OOM
Executors.newCachedThreadPool(); // 最大线程数为 Integer.MAX_VALUE → 线程无限创建 → OOM
推荐直接使用 ThreadPoolExecutor 构造器:
new ThreadPoolExecutor(
corePoolSize,
maximumPoolSize,
keepAliveTime,
TimeUnit.SECONDS,
new ArrayBlockingQueue<>(100), // 有界队列,避免 OOM
new ThreadPoolExecutor.CallerRunsPolicy() // 自定义拒绝策略
);
核心参数含义与设置原则:
corePoolSize:核心线程数maximumPoolSize:最大线程数keepAliveTime:非核心线程空闲存活时间workQueue:任务队列(必须用有界队列)handler:拒绝策略设置经验:
corePoolSize = CPU 核数 + 1corePoolSize = 2 * CPU 核数(IO 等待时可多开线程)| 回收器 | 特点 | 适用场景 |
|---|---|---|
| CMS | 并发收集,低停顿 | 对响应时间要求高的应用 |
| G1 | 区域化分代,可预测停顿 | 服务端多核大内存,替代 CMS |
| ZGC | 极低停顿(<10ms) | 超大堆内存(TB 级) |
面试加分点:
| 类型 | 线程安全 | 性能 | 使用场景 |
|---|---|---|---|
| String | 不可变(安全) | 低 | 字符串常量,少量拼接 |
| StringBuffer | 安全(方法加 synchronized) | 中 | 多线程大量操作字符串 |
| StringBuilder | 不安全 | 高 | 单线程大量操作字符串(首选) |
规范约定:
若不重写:
示例:
Map<Person, String> map = new HashMap<>();
map.put(new Person("Tom"), "value");
map.get(new Person("Tom")); // 若不重写 hashCode,返回 null
很多人不是不懂,而是不会表达。
面试官追问时,容易慌张、逻辑混乱。
正确姿势:结构化回答
例如回答'HashMap 1.8 为什么要引入红黑树?'
结论: 1.8 引入红黑树是为了解决极端哈希碰撞下链表过长导致的性能下降问题。 原理: 当链表长度 ≥ 8 且数组长度 ≥ 64 时,链表会树化为红黑树,查找复杂度从 O(n) 降为 O(log n)。 源码: 在
putVal方法中,当链表长度超过 TREEIFY_THRESHOLD = 8 时,调用treeifyBin方法尝试树化。 场景: 如果大量 key 的哈希冲突严重(比如对象 hashCode 设计不合理),树化能保证最坏情况下的性能。
这叫 '降维打击式回答'——让面试官觉得你不仅懂,而且条理清晰。
拼的是:
你现在看到这篇文章,说明你已经开始认真了。
基础扎实的人,从来不怕面试。
Java 面试想拿目标岗位:
基础不牢,地动山摇。 只要把基础打透,Offer 自然会来。

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
查找任何按下的键的javascript键代码、代码、位置和修饰符。 在线工具,Keycode 信息在线工具,online
JavaScript 字符串转义/反转义;Java 风格 \uXXXX(Native2Ascii)编码与解码。 在线工具,Escape 与 Native 编解码在线工具,online
使用 Prettier 在浏览器内格式化 JavaScript 或 HTML 片段。 在线工具,JavaScript / HTML 格式化在线工具,online
Terser 压缩、变量名混淆,或 javascript-obfuscator 高强度混淆(体积会增大)。 在线工具,JavaScript 压缩与混淆在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online