整理了Java 面试必问的基础题,覆盖基础语法、面向对象、集合、异常、多线程、JVM 等核心考点,答案简洁好记,适合面试突击背诵。
一、Java 基础语法
1. JDK、JRE、JVM 的区别?
- JVM:Java 虚拟机,负责将字节码翻译成机器码,实现跨平台。
- JRE:Java 运行时环境,包含 JVM + 核心类库,只能运行 Java 程序。
- JDK:Java 开发工具包,包含 JRE + 编译器 (javac) + 调试工具,既能运行又能开发 Java 程序。
2. == 和 equals () 的区别?
- ==:基本类型比较值;引用类型比较内存地址。
- equals():
- 未重写:和 == 一样,比较地址;
- 重写(如 String、Integer):比较内容。
3. String、StringBuilder、StringBuffer 区别?
- String:不可变字符序列,线程安全,效率低。
- StringBuilder:可变字符序列,非线程安全,效率最高。
- StringBuffer:可变字符序列,线程安全(加了 synchronized),效率中等。
4. 重载和重写的区别?
- 重载(Overload):同一个类中,方法名相同,参数列表不同(个数、类型、顺序),与返回值无关。
- 重写(Override):子类重写父类方法,方法名、参数列表、返回值都相同,子类权限不能更小,不能抛出更大异常。
5. final 关键字的作用?
- 修饰类:类不能被继承。
- 修饰方法:方法不能被重写。
- 修饰变量:变量变为常量,只能赋值一次。
二、面向对象(OOP)
6. 面向对象的四大特性?
封装、继承、多态、抽象
- 封装:隐藏实现细节,对外提供接口。
- 继承:子类复用父类属性和方法。
- 多态:父类引用指向子类对象,编译看左边,运行看右边。
- 抽象:抽离公共特征,用抽象类 / 接口实现。
7. 接口和抽象类的区别?
表格
| 特性 | 接口 | 抽象类 |
|---|---|---|
| 继承 | 多实现 | 单继承 |
| 方法 | 默认 public abstract(JDK8 + 支持默认方法) | 可以有抽象 / 普通方法 |
| 变量 | 只能是 public static final 常量 | 可以有普通变量 |
| 构造器 | 无 | 有 |
8. 多态的实现条件?
- 继承 / 实现关系
- 方法重写
- 父类引用指向子类对象
三、集合框架(高频)
9. List、Set、Map 的区别?
- List:有序、可重复、可通过索引访问。
- Set:无序、不可重复。
- Map:键值对存储,Key 不可重复,Value 可重复。
10. ArrayList 和 LinkedList 区别?
- ArrayList:数组结构,查询快,增删慢,线程不安全。
- LinkedList:双向链表,查询慢,增删快,线程不安全。
11. HashMap 和 Hashtable 区别?
- HashMap:线程不安全,允许 null 键 / 值,效率高。
- Hashtable:线程安全(synchronized),不允许 null,效率低。
12. HashMap 底层原理?
JDK7:数组 + 链表 JDK8+:数组 + 链表 + 红黑树(链表长度≥8 转红黑树,≤6 转回链表) 核心:通过 hash 算法计算索引,解决哈希冲突用链表 / 红黑树。
13. ConcurrentHashMap 线程安全原理?
- JDK7:分段锁(Segment),减小锁粒度。
- JDK8+:CAS + synchronized,锁头节点,效率更高。
四、异常处理
14. Checked 和 Unchecked 异常区别?
- 受检异常(Checked):编译期必须处理(try-catch/throws),如 IOException、SQLException。
- 非受检异常(Unchecked):运行时异常,编译不检查,如 NullPointerException、ArrayIndexOutOfBoundsException。
15. throw 和 throws 区别?
- throw:手动抛出一个异常对象,在方法体内。
- throws:方法声明可能抛出异常,在方法签名上。
16. final、finally、finalize 区别?
- final:修饰类、方法、变量,不可变。
- finally:配合 try-catch,一定执行(除非 JVM 退出),用于释放资源。
- finalize:Object 方法,垃圾回收前调用,已废弃。
五、多线程与并发
17. 线程和进程的区别?
- 进程:操作系统资源分配的最小单位,独立内存空间。
- 线程:CPU 调度的最小单位,共享进程内存。
18. 创建线程的 4 种方式?
- 继承 Thread 类
- 实现 Runnable 接口
- 实现 Callable 接口(带返回值)
- 线程池 Executors/ThreadPoolExecutor
19. 线程的生命周期?
新建 → 就绪 → 运行 → 阻塞 → 死亡
20. sleep () 和 wait () 区别?
- sleep ():Thread 方法,不释放锁,时间到自动唤醒。
- wait ():Object 方法,释放锁,需 notify ()/notifyAll () 唤醒。
21. synchronized 和 Lock 区别?
- synchronized:JVM 实现,自动加锁解锁,不可中断,非公平锁。
- Lock:API 层面,手动加锁解锁,可中断,支持公平 / 非公平锁。
22. 死锁的四个条件?
- 互斥条件
- 请求与保持
- 不可剥夺
- 循环等待破坏任意一个即可避免死锁。
六、JVM 与内存
23. JVM 内存模型(运行时数据区)?
- 程序计数器
- 虚拟机栈
- 本地方法栈
- 堆(存储对象,GC 主要区域)
- 方法区(存储类信息、常量、静态变量)
24. 堆内存分代?
- 新生代:Eden + 两个 Survivor
- 老年代
- 元空间(JDK8+ 替代永久代)
25. GC 垃圾回收机制?
判断对象死亡:引用计数法、可达性分析算法垃圾回收算法:标记 - 清除、标记 - 复制、标记 - 整理
七、IO 流
26. BIO、NIO、AIO 区别?
- BIO:同步阻塞,一个连接一个线程。
- NIO:同步非阻塞,多路复用。
- AIO:异步非阻塞,回调通知。
27. 字节流和字符流?
- 字节流:InputStream/OutputStream,处理所有文件(图片、视频)。
- 字符流:Reader/Writer,处理纯文本文件。
面试突击建议
- 先背高频题:== 和 equals、HashMap、多线程、异常、面向对象。
- 结合场景说:比如问集合,直接说业务中用 ArrayList 做查询、HashMap 做缓存。
- 手写代码准备:单例模式、排序、线程创建、HashMap 原理。