引言
Java 作为全球最流行的编程语言之一,其面试题不仅考察候选人的编程能力,更关注对底层原理和架构设计的理解。本文将系统梳理 Java 面试中的高频考点,结合代码示例与原理分析,助您从容应对技术面试。
一、Java 基础语法与核心特性
1. String、StringBuilder 与 StringBuffer 的区别
- String:不可变对象,每次修改都会生成新对象,适合少量字符串操作。
- StringBuilder:可变字符序列,线程不安全,性能高,适合单线程环境。
- StringBuffer:可变字符序列,线程安全(通过
synchronized
修饰方法),适合多线程环境。
示例代码:
java
String str = "hello";
str += "world"; // 生成新对象"helloworld"
StringBuilder sb = new StringBuilder();
sb.append("hello").append("world"); // 直接修改原对象
2. 异常处理机制
- 受检异常(Checked Exception):必须显式捕获或抛出(如
IOException
)。 - 非受检异常(Unchecked Exception):无需显式处理(如
NullPointerException
)。 - 最佳实践:用
finally
释放资源,优先捕获具体异常而非Exception
。
二、面向对象与设计模式
3. 多态的实现方式
- 重载(Overloading):编译时多态,通过参数列表区分。
- 重写(Overriding):运行时多态,基于动态绑定。
示例:
java
class Animal {
public void sound() { System.out.println("Animal makes sound"); }
}
class Dog extends Animal {
@Override
public void sound() { System.out.println("Woof!"); }
}
4. 单例模式的线程安全实现
双重检查锁定(DCL):
java
public class Singleton {
private static volatile Singleton instance; // volatile防止指令重排
private Singleton() {}
public static Singleton getInstance() {
if (instance == null) {
synchronized (Singleton.class) {
if (instance == null) {
instance = new Singleton();
}
}
}
return instance;
}
}
三、多线程与并发编程
5. 线程的创建方式
- 继承
Thread
类:代码简单,但扩展性差。 - 实现
Runnable
接口:推荐方式,支持资源共享。 - 实现
Callable
接口:可返回值并抛出异常。
示例:
java
ExecutorService executor = Executors.newFixedThreadPool(1);
Future<String> future = executor.submit(() -> "Hello from Callable");
6. 锁机制对比
锁类型 | 实现方式 | 特性 |
---|---|---|
内置锁 | synchronized |
可重入、非公平 |
显式锁 | ReentrantLock |
可重入、公平性可选 |
读写锁 | ReentrantReadWriteLock |
读共享、写独占 |
四、集合框架与数据结构
7. ArrayList 与 LinkedList 的选择
- ArrayList:基于数组,随机访问快,插入 / 删除慢。
- LinkedList:基于双向链表,插入 / 删除快,随机访问慢。
应用场景:
- 频繁查询 → ArrayList
- 频繁增删 → LinkedList
8. HashMap 的底层实现
- JDK 1.7:数组 + 链表
- JDK 1.8:数组 + 链表 + 红黑树(链表长度≥8 时转换为红黑树)
- 线程安全:使用
ConcurrentHashMap
或Hashtable
五、JVM 原理与性能优化
9. JVM 内存区域划分
- 堆(Heap):存储对象实例,GC 主要区域。
- 方法区(Method Area):存储类信息、常量等。
- 程序计数器(PC Register):记录当前线程执行的字节码指令地址。
10. GC 算法对比
- 标记 - 清除:简单但易产生碎片。
- 复制算法:无碎片,适合新生代。
- 标记 - 整理:减少碎片,适合老年代。
六、数据库与 SQL 优化
11. 事务的隔离级别
- 读未提交(Read Uncommitted):可能出现脏读。
- 读已提交(Read Committed):避免脏读,可能出现不可重复读。
- 可重复读(Repeatable Read):默认级别,避免脏读和不可重复读。
- 串行化(Serializable):最高级别,完全隔离。
12. SQL 优化策略
- 索引优化:为高频查询字段添加索引。
- 分页优化:使用
LIMIT offset, size
时,通过覆盖索引减少回表。 - 批量操作:使用
INSERT INTO ... VALUES (...), (...), ...
减少网络 IO。
七、主流框架与中间件
13. Spring IOC 与 AOP
- IOC(控制反转):通过依赖注入(DI)解耦组件。
- AOP(面向切面编程):用于日志、事务等横切关注点。
示例:
java
@Service
public class UserService {
@Autowired
private UserRepository repository; // 自动注入依赖
}
14. MyBatis 的缓存机制
- 一级缓存:SqlSession 级别的本地缓存。
- 二级缓存:全局缓存,基于
Cache
接口实现。
八、分布式系统设计
15. CAP 定理与 BASE 理论
- CAP:一致性(Consistency)、可用性(Availability)、分区容错性(Partition Tolerance)。
- BASE:基本可用(Basically Available)、软状态(Soft State)、最终一致性(Eventually Consistent)。
16. 服务治理的核心问题
- 服务发现:Eureka、Consul。
- 负载均衡:Ribbon、Nginx。
- 熔断降级:Hystrix、Sentinel。
结语
Java 面试的核心在于 “知其然,更知其所以然”,建议:
- 结合项目经验理解知识点
- 深入阅读源码(如集合框架、并发包)
- 多做模拟面试(推荐 LeetCode、剑指 Offer)
通过系统梳理与针对性练习,您将在面试中展现扎实的技术功底与架构思维。