Java 高频面试题汇总与核心知识点解析
本文整理了 Java 开发面试中的核心高频考点,涵盖基础语法、JVM 原理、并发编程及主流框架等模块。内容基于实际工程经验梳理,旨在帮助开发者深入理解底层机制,规避常见陷阱。
一、基础篇
1. Java 语言特点
- 简单易学:拥有丰富的类库支持。
- 面向对象:封装、继承、多态特性降低耦合度,提高内聚性。
- 跨平台性:依赖 JVM 实现'一次编写,到处运行'。
- 可靠安全:提供内存管理、异常处理及安全机制。
- 多线程支持:内置线程模型,便于并发处理。
2. 面向对象与面向过程的区别
面向过程侧重于解决问题的步骤,通过函数调用实现,性能较高,常用于单片机或嵌入式开发。
面向对象将事务分解为对象,描述事物在解决问题过程中的行为。具备封装、继承、多态特性,易维护、易复用、易扩展,适合构建低耦合系统,但性能略低于面向过程。
3. 基本数据类型与封装类
Java 有八种基本数据类型,对应的封装类如下表所示(注:具体大小依架构而定)。

注意:
int是基本类型,默认值为0;Integer是引用类型,默认值为null。这使得Integer能区分0和null的状态。在使用引用类型前必须实例化,否则报错。数组赋值时复制的是引用地址,修改一个会影响另一个。
关于 boolean 类型,JVM 中无专用字节码指令,编译后通常使用 int 替代。在数组中,每个 boolean 元素占 1 个字节。这是因为 32 位 CPU 一次处理 32 位数据效率更高。
4. 标识符命名规则
- 硬性要求:包含字母、数字、
$、_;不能以数字开头;不能是关键字。 - 规范建议:
- 类名:大驼峰式(如
UserManager)。 - 变量/方法名:小驼峰式(如
userName,getUserInfo)。
- 类名:大驼峰式(如
5. instanceof 关键字
用于测试对象是否属于某个类的实例。用法:
boolean result = obj instanceof Class;
其中 obj 为对象,Class 为类或接口。若 obj 是该类的实例或其子类、实现类,返回 true;否则返回 false。编译器会检查类型转换可行性。
示例:
int i = 0;
// System.out.println(i instanceof Integer); // 编译错误:基本类型不能使用 instanceof
Integer integer = new Integer(1);
System.out.println(integer instanceof Integer); // true
System.out.println(null instanceof Object); // false
6. 自动装箱与拆箱
- 装箱:基本类型转包装器类型(如
int->Integer),调用valueOf()。 - 拆箱:包装器类型转基本类型(如
Integer->int),调用intValue()。
面试题解析:
public class Main {
public static void main(String[] args) {
Integer i1 = 100;
Integer i2 = 100;
Integer i3 = 200;
Integer i4 = 200;
System.out.println(i1 == i2); // true
System.out.println(i3 == i4); // false
}
}
原因分析:
Integer.valueOf() 源码中使用了缓存池 IntegerCache。数值在 -128 到 127 之间时,直接返回缓存对象;超出范围则新建对象。因此 i1 和 i2 指向同一对象,而 i3 和 i4 不同。
对于 Double 类型,由于浮点数范围过大,不存在类似缓存机制,因此比较结果均为 false。
7. 重载与重写
重写 (Override):发生在父子类之间。方法名、参数列表、返回类型(需兼容)必须相同。访问权限不能低于父类方法。不能抛出比父类更宽泛的受检异常。
重载 (Overload):发生在同一个类中。方法名相同,但参数列表(类型、个数、顺序)不同。返回值类型不作为重载判断依据。
二、JVM 篇
1. JVM 内存模型
JVM 运行时数据区分为线程私有区和线程共享区。
线程私有区:
- 程序计数器:记录当前线程执行的字节码地址,执行 Native 方法时为空。
- 虚拟机栈:存储局部变量表、操作数栈、动态链接等信息。栈深度超限抛出
StackOverflowError,无法扩展抛出OutOfMemoryError。 - 本地方法栈:服务于 Native 方法(如 C/C++)。
线程共享区:
- 堆 (Heap):存放对象实例,GC 主要区域。分为新生代(Eden, S0, S1)和老年代。空间不足抛出 OOM。
- 方法区:存储类信息、常量、静态变量。JDK 1.7 为永久代,1.8 起为元空间。

2. 类加载机制
加载过程:验证、准备、解析合称链接。初始化阶段执行静态块和静态变量赋值。
双亲委派模式:加载器先将请求委托给父加载器,直到顶层启动类加载器。若父级无法加载,子级才尝试。
- 优点:避免类重复加载,防止核心 API 被篡改。

3. 垃圾回收算法
分代回收:基于对象存活周期不同,年轻代采用标记 - 复制,老年代采用标记 - 清除。
G1 算法:JDK 9+ 默认。将堆划分为逻辑区域,减少停顿时间,支持增量式清理。
ZGC 算法:针对大堆设计,停顿时间可控制在 10ms 以内。采用着色指针、读屏障等技术实现并发处理。

4. 内存可见性与 JMM
JMM 定义变量访问规则,线程操作只能在各自工作内存中进行。为解决指令重排序带来的问题,JMM 提供原子性、可见性、有序性保证。

注:以上仅为部分核心内容整理,完整题库涵盖 Spring、MyBatis、MySQL、Redis、分布式架构等更多模块。!


