1. Java基础面试题概述
Java作为一门经久不衰的编程语言,其基础知识的掌握程度往往是面试官评估候选人技术功底的首要标准。根据我多年参与技术面试的经验,Java基础面试题通常覆盖语言特性、核心类库、面向对象原理等关键领域,这些题目看似简单,却能精准考察开发者对语言本质的理解深度。
在技术面试中,约70%的初级岗位和50%的中级岗位面试都会从基础题切入。面试官通过这类问题不仅能评估候选人的基本功,还能观察其思维逻辑和问题分析能力。我曾见过不少候选人能熟练使用Spring框架却回答不出"equals和==的区别"这样的基础问题,这种知识结构的失衡往往会成为面试中的致命弱点。
2. Java核心语法面试题解析
2.1 数据类型与运算符
Java的数据类型系统是面试中最常被考察的基础知识点之一。以下这些题目几乎出现在90%的Java技术面试中:
-
基本数据类型与引用类型的区别
- 基本类型:直接存储值,包括byte/short/int/long/float/double/char/boolean
- 引用类型:存储对象地址,包括类、接口、数组等
关键点:基本类型在栈上分配内存,而引用类型在堆上分配,栈中存储引用地址
-
自动装箱与拆箱机制
java复制Integer a = 100; // 自动装箱 int b = a; // 自动拆箱常见陷阱:
java复制Integer x = 127; Integer y = 127; System.out.println(x == y); // true,因为-128~127会被缓存 Integer m = 128; Integer n = 128; System.out.println(m == n); // false,超出缓存范围 -
==与equals的区别
- ==:比较基本类型的值或引用类型的地址
- equals:默认比较地址,但可被重写(如String重写为比较内容)
2.2 流程控制与异常处理
-
try-catch-finally执行顺序
java复制try { // 可能抛出异常的代码 return 1; } catch(Exception e) { return 2; } finally { return 3; // 最终会返回3 }注意:finally中的return会覆盖try和catch中的返回值
-
异常分类
- Checked Exception:必须捕获或声明抛出(IOException等)
- Unchecked Exception:RuntimeException及其子类
- Error:系统级错误(OutOfMemoryError等)
3. 面向对象核心概念
3.1 类与对象
-
构造方法的特点
- 与类同名
- 无返回值类型
- 可以重载
- 子类构造方法默认调用父类无参构造
-
this与super关键字的区别
- this:指向当前对象实例
- super:指向父类对象引用
java复制public class Animal { public Animal(String name) { // 父类构造 } } public class Dog extends Animal { public Dog() { super("default"); // 必须显式调用父类有参构造 } }
3.2 继承与多态
-
方法重写(Override)规则
- 方法名、参数列表必须相同
- 返回类型可以是被重写方法返回类型的子类
- 访问权限不能比父类更严格
- 不能抛出比父类更宽泛的异常
-
多态的实现原理
java复制class Animal { void eat() { System.out.println("animal eating"); } } class Dog extends Animal { void eat() { System.out.println("dog eating"); } } Animal a = new Dog(); a.eat(); // 输出"dog eating",体现运行时多态
4. Java集合框架精要
4.1 List接口实现对比
| 特性 | ArrayList | LinkedList | Vector |
|---|---|---|---|
| 底层结构 | 动态数组 | 双向链表 | 动态数组 |
| 线程安全 | 不安全 | 不安全 | 安全(synchronized) |
| 随机访问效率 | O(1) | O(n) | O(1) |
| 插入删除效率 | O(n) | O(1) | O(n) |
| 扩容机制 | 1.5倍 | 无 | 2倍 |
4.2 HashMap原理剖析
-
JDK1.8的改进
- 数组+链表+红黑树结构
- 链表长度>8时转为红黑树
- 扩容时保持元素顺序
-
关键参数
java复制static final int DEFAULT_INITIAL_CAPACITY = 16; // 默认容量 static final float DEFAULT_LOAD_FACTOR = 0.75f; // 负载因子 static final int TREEIFY_THRESHOLD = 8; // 树化阈值 -
put方法执行流程
- 计算key的hash值
- 如果数组为空则初始化
- 计算数组下标:(n-1) & hash
- 处理哈希冲突(链表或红黑树)
- 判断是否需要扩容
5. 并发编程核心考点
5.1 线程创建方式
-
继承Thread类
java复制class MyThread extends Thread { public void run() { // 线程执行逻辑 } } new MyThread().start(); -
实现Runnable接口(推荐)
java复制class MyRunnable implements Runnable { public void run() { // 线程执行逻辑 } } new Thread(new MyRunnable()).start(); -
实现Callable接口
java复制class MyCallable implements Callable<String> { public String call() throws Exception { return "result"; } } FutureTask<String> task = new FutureTask<>(new MyCallable()); new Thread(task).start(); String result = task.get(); // 获取返回值
5.2 synchronized与Lock对比
| 特性 | synchronized | ReentrantLock |
|---|---|---|
| 实现机制 | JVM层面 | API层面 |
| 锁获取方式 | 自动获取和释放 | 需要手动lock/unlock |
| 可中断性 | 不可中断 | 支持lockInterruptibly() |
| 公平锁 | 非公平 | 可配置公平/非公平 |
| 条件变量 | 一个锁一个条件 | 一个锁多个条件 |
| 性能 | JDK6后优化,性能接近 | 高竞争下表现更好 |
6. JVM基础问题集锦
6.1 内存区域划分
- 程序计数器:线程私有,记录当前线程执行位置
- 虚拟机栈:线程私有,存储栈帧(局部变量表、操作数栈等)
- 本地方法栈:为Native方法服务
- 堆:所有对象实例分配区域,GC主要工作区
- 方法区:存储类信息、常量、静态变量等
6.2 GC算法与收集器
-
常见GC算法
- 标记-清除:产生内存碎片
- 标记-整理:解决碎片问题
- 复制算法:新生代常用(Eden/Survivor区)
- 分代收集:结合多种算法
-
垃圾收集器对比
- Serial:单线程,适合客户端应用
- Parallel Scavenge:吞吐量优先
- CMS:低延迟,已废弃
- G1:区域化分代式,JDK9默认
- ZGC:超低延迟,JDK15生产可用
7. IO与NIO核心区别
7.1 传统IO模型
-
特点
- 面向流(Stream)
- 阻塞式IO
- 字节/字符为单位传输
-
典型类
- InputStream/OutputStream
- Reader/Writer
- BufferedInputStream等装饰器类
7.2 NIO新特性
-
三大核心组件
- Channel:双向通道
- Buffer:数据缓冲区
- Selector:多路复用器
-
优势
- 非阻塞IO
- 零拷贝技术
- 更高效的网络编程
java复制// NIO文件复制示例
try (FileChannel src = new FileInputStream("source.txt").getChannel();
FileChannel dest = new FileOutputStream("dest.txt").getChannel()) {
dest.transferFrom(src, 0, src.size()); // 零拷贝操作
}
8. 常见问题排查技巧
8.1 内存泄漏定位
-
症状表现
- GC日志频繁Full GC
- 堆内存持续增长不释放
- OOM异常
-
排查工具
- jps:查看Java进程
- jmap:生成堆转储快照
- jstack:查看线程栈
- VisualVM:图形化分析工具
-
常见泄漏场景
- 静态集合持有对象引用
- 未关闭的资源(连接、流等)
- 监听器未注销
- 不合理的作用域
8.2 死锁诊断
-
识别死锁
bash复制
jstack <pid> | grep -A 10 deadlock -
预防措施
- 避免嵌套锁
- 使用定时锁(tryLock)
- 按固定顺序获取锁
- 减小锁粒度
9. Java 8+新特性精要
9.1 Lambda表达式
java复制// 传统方式
Collections.sort(list, new Comparator<String>() {
public int compare(String s1, String s2) {
return s1.length() - s2.length();
}
});
// Lambda方式
Collections.sort(list, (s1, s2) -> s1.length() - s2.length());
9.2 Stream API
java复制List<String> result = list.stream()
.filter(s -> s.startsWith("A"))
.map(String::toUpperCase)
.sorted()
.collect(Collectors.toList());
9.3 Optional类
java复制Optional<String> opt = Optional.ofNullable(getString());
String value = opt.orElse("default");
opt.ifPresent(v -> System.out.println(v));
10. 面试实战建议
-
回答技巧
- STAR法则:情境(Situation)、任务(Task)、行动(Action)、结果(Result)
- 先给出明确结论,再展开分析
- 遇到难题时展示思考过程
-
高频问题准备
- HashMap扩容机制
- JVM内存模型
- synchronized实现原理
- Spring循环依赖解决
-
项目经验梳理
- 准备2-3个技术亮点的深入分析
- 量化项目成果(如QPS提升、延迟降低等)
- 总结遇到的挑战和解决方案
在准备Java基础面试时,建议建立自己的知识脑图,将零散的知识点系统化。对于每个核心概念,不仅要知其然,更要理解背后的设计思想和取舍考量。例如,理解为什么String要设计为不可变类,这种设计带来了哪些优势和代价。
