Java 常见面试题
→ 返回 面试
按主题整理的 Java 高频面试 Q&A;详细原理见 Java 基础 各专题笔记。
面向对象
| 问题 | 简答 | 深入 |
|---|
| 抽象类和接口的区别? | is-a vs can-do;单继承 vs 多实现;抽象类可有字段和构造器 | 抽象类和接口的区别 |
| 抽象类有构造方法吗? | 有,供子类 super(),不能 new 抽象类 | 抽象类会有构造函数吗 |
| 接口有构造方法吗? | 没有,接口不能实例化、无实例字段 | 接口能有构造方法吗 |
| 重载 vs 重写? | 重载:同名不同参,编译期绑定;重写:子类改父类方法,运行期多态 | 面向对象 |
== 和 equals? | == 比引用(基本类型比值);equals 默认同 ==,可重写比内容 | equals与hashCode |
为什么重写 equals 必须重写 hashCode? | 相等对象 hash 必须相同;否则 HashMap/HashSet 行为错误 | equals与hashCode |
| 深拷贝 vs 浅拷贝? | 浅拷贝共享引用字段;深拷贝递归复制引用对象 | 对象 |
Q:final 修饰类 / 方法 / 变量?
A:类不可继承;方法不可重写;变量引用不可改(基本类型值不可改,引用对象内容仍可改)。
String 与基础类型
| 问题 | 简答 |
|---|
String 为什么不可变? | final char[]/字节数组 + 无修改方法;线程安全、可缓存 hash、字符串池 |
| 字符串常量池? | 字面量、intern() 复用;JDK 7+ 池在堆中 |
String / StringBuilder / StringBuffer? | String 不可变;StringBuilder 线程不安全快;StringBuffer 同步慢 |
| 自动装箱拆箱陷阱? | Integer 缓存 -128~127;== 比较包装类可能错;拆箱 NPE |
集合
| 问题 | 简答 | 深入 |
|---|
ArrayList vs LinkedList? | 数组随机访问 O(1);链表插删 O(1) 但定位 O(n) | 集合框架 |
HashMap 原理? | 数组+链表/红黑树;hash 扰动;负载因子 0.75 扩容 2 倍 | HashMap原理 |
HashMap 线程安全吗? | 否;并发用 ConcurrentHashMap | HashMap原理 · Java多线程与JUC |
ConcurrentHashMap JDK7 vs 8? | 7 分段锁 Segment;8 CAS+synchronized 锁桶头 | Java多线程与JUC |
fail-fast vs fail-safe? | 迭代时改结构抛异常 vs 副本迭代(如 CopyOnWriteArrayList) | 同上 |
Q:HashSet 如何保证不重复?
A:底层 HashMap,元素作 key,value 固定占位;靠 hashCode + equals。
并发(JUC)
| 问题 | 简答 | 深入 |
|---|
| 进程 vs 线程? | 资源分配 vs 调度单位;线程共享进程堆、独立栈 | 进程与线程 |
| 创建线程的方式? | Thread、Runnable、Callable+Future、线程池 | JUC |
synchronized vs ReentrantLock? | 关键字/JVM 监视器 vs API;Lock 可中断、公平、多 Condition | Java多线程与JUC |
volatile 作用? | 可见性 + 禁止部分重排序;不保证复合操作原子性 | Java多线程与JUC · JMM |
| 什么是 happens-before? | JMM 规则,保证可见性的偏序关系 | 同上 |
| 死锁条件与避免? | 互斥、占有且等待、不可抢占、循环等待;固定加锁顺序、超时 | 数据库死锁 · 死锁 |
ThreadLocal 原理与泄漏? | 线程内 Map;线程池场景用完须 remove() | JUC |
| 线程池核心参数? | core、max、queue、keepAlive、拒绝策略 | Java多线程与JUC |
Q:sleep 和 wait 区别?
A:sleep 不释放锁,属 Thread;wait 释放监视器,须在 synchronized 内,属 Object。
JVM 与 GC
| 问题 | 简答 | 深入 |
|---|
| JVM 内存结构? | 堆、栈、方法区/元空间、程序计数器、本地方法栈 | JVM内存结构与垃圾回收 |
| 堆 vs 栈? | 堆存对象;栈存局部变量、引用、方法帧 | 同上 |
| 常见 GC 算法? | 标记-清除、标记-复制、标记-整理 | 同上 |
| 分代收集? | 新生代(Eden/S0/S1)+ 老年代;Minor/Full GC | 同上 |
| G1 / ZGC 特点? | G1 分区可预测停顿;ZGC 超低延迟(染色指针) | 同上 |
| 类加载过程? | 加载→验证→准备→解析→初始化 | 类加载与双亲委派 |
| 双亲委派? | 子加载器先委派父加载器;防核心类被篡改 | 同上 |
| 如何排查 OOM? | 堆 dump、MAT;看老年代泄漏、大对象、元空间 | jmap |
Q:对象一定在堆上吗?
A:多数在堆;逃逸分析后可能栈上分配或标量替换(JIT 优化)。
泛型、Stream 与反射
| 问题 | 简答 | 深入 |
|---|
| 为什么需要泛型? | 编译期类型检查,消除强转 | Java泛型 |
| PECS 原则? | Producer extends,Consumer super | 同上 |
map vs flatMap? | 1→1 vs 1→多再展平 | JavaStream |
| Stream 为何惰性? | 中间操作不执行,终止操作才遍历 | 同上 |
| 反射获取 Class 几种方式? | .class、getClass()、Class.forName | Java反射 |
IO 与异常
| 问题 | 简答 | 深入 |
|---|
| BIO / NIO / AIO? | 阻塞流;Channel+Buffer 多路复用;异步回调 | IO与NIO |
| 受检 vs 非受检异常? | 必须处理/声明 throws vs RuntimeException | 异常处理 |
try-with-resources? | 自动关闭 AutoCloseable,抑制异常链 | 同上 |
Spring / 后端(简答)
详见 SpringBoot常见面试题。
| 问题 | 简答 | 深入 |
|---|
| IOC / DI? | 容器管理 Bean 生命周期与依赖注入 | IOC与DI |
| AOP 原理? | 动态代理(JDK 接口 / CGLIB 子类) | AOP |
| Bean 生命周期? | 实例化→注入→初始化→使用→销毁 | Bean生命周期 |
@Transactional 失效场景? | 非 public、自调用、异常被吞、错误 rollbackFor | SpringBoot事务失效场景 |
| Spring Boot 自动配置? | @EnableAutoConfiguration + .imports / spring.factories | 自动配置 |
设计模式(常问)
详见 设计模式常见面试题。
| 模式 | 一句话 | 深入 |
|---|
| 单例 | 全局唯一实例;枚举/静态内部类防反射序列化破坏 | 单例模式 |
| 工厂 / 抽象工厂 | 封装创建逻辑,解耦具体类 | 设计模式常见面试题 |
| 代理 | 控制访问;Spring AOP 基础 | 同上 |
| 观察者 | 发布-订阅;事件驱动 | 同上 |
答题建议
- 先结论后原理:如 HashMap → 数组+链表/树 → 再讲扩容、线程不安全。
- 带边界:volatile 不保证 i++ 原子性;synchronized 锁的是对象不是代码。
- 链到项目:线程池参数怎么配、事务为什么失效、线上 OOM 怎么查。
- 细节笔记:本文只做速查,深入阅读上方 wikilink 专题。
专题笔记
面向对象
集合与并发
JVM
语言特性
设计模式
其他专题