1. Java基础面经(二)概述
作为Java开发者面试的必备资料,这份面经涵盖了Java基础知识的多个核心领域。不同于初级面经的入门内容,本部分更侧重于考察开发者对Java语言特性的深入理解和实际应用能力。面试官通常会通过这些题目评估候选人的基本功是否扎实,是否具备解决复杂问题的思维模式。
2. 核心知识点解析
2.1 Java内存模型与垃圾回收
Java内存模型(JMM)是面试中的高频考点。理解JMM需要掌握以下几个关键点:
内存区域划分:
- 堆内存(Heap):存储对象实例,是GC主要工作区域
- 方法区(Method Area):存储类信息、常量、静态变量
- 虚拟机栈(VM Stack):存储局部变量表、操作数栈等
- 本地方法栈(Native Method Stack)
- 程序计数器(Program Counter Register)
垃圾回收算法:
- 标记-清除算法:会产生内存碎片
- 复制算法:适合新生代,需要双倍空间
- 标记-整理算法:适合老年代,避免碎片
- 分代收集算法:商业虚拟机常用策略
实际面试中常被问到的GC问题:如何判断对象是否存活?GC Roots包括哪些对象?各种垃圾收集器的特点比较?
2.2 集合框架深度解析
Java集合框架是日常开发中最常用的工具之一,面试中常考察的点包括:
List接口实现比较:
- ArrayList:基于动态数组,随机访问快
- LinkedList:基于双向链表,插入删除快
- Vector:线程安全的ArrayList,但性能较差
Map实现类对比:
// HashMap示例代码 Map<String, Integer> map = new HashMap<>(); map.put("a", 1); map.get("a");- HashMap:数组+链表/红黑树,非线程安全
- ConcurrentHashMap:分段锁实现线程安全
- LinkedHashMap:保持插入顺序
- TreeMap:基于红黑树的有序Map
Fail-Fast与Fail-Safe机制:
- ArrayList等集合的迭代器是Fail-Fast的
- CopyOnWriteArrayList是Fail-Safe的
3. 多线程与并发编程
3.1 线程基础
创建线程的三种方式:
- 继承Thread类
- 实现Runnable接口
- 实现Callable接口(可获取返回值)
线程状态转换:
- NEW -> RUNNABLE -> BLOCKED -> WAITING -> TIMED_WAITING -> TERMINATED
3.2 线程同步机制
synchronized关键字:
- 修饰实例方法:锁是当前实例对象
- 修饰静态方法:锁是当前类的Class对象
- 同步代码块:可指定锁对象
Lock接口及其实现:
Lock lock = new ReentrantLock(); lock.lock(); try { // 临界区代码 } finally { lock.unlock(); }volatile关键字:
- 保证可见性
- 禁止指令重排序
- 不保证原子性
4. Java 8新特性
4.1 Lambda表达式
Lambda表达式使代码更简洁:
List<String> list = Arrays.asList("a", "b", "c"); list.forEach(s -> System.out.println(s));4.2 Stream API
Stream提供了强大的数据处理能力:
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5); int sum = numbers.stream() .filter(n -> n % 2 == 0) .mapToInt(Integer::intValue) .sum();4.3 Optional类
避免NullPointerException的优雅解决方案:
Optional<String> optional = Optional.ofNullable(getString()); String result = optional.orElse("default");5. 异常处理机制
5.1 异常体系结构
Throwable:
- Error:系统级错误,如OutOfMemoryError
- Exception:
- 检查型异常(Checked Exception)
- 非检查型异常(Unchecked Exception/RuntimeException)
异常处理最佳实践:
- 不要捕获Throwable
- 不要忽略异常
- 使用特定的异常类型
- 记录完整的异常信息
6. 设计模式应用
6.1 单例模式实现
- 饿汉式:
public class Singleton { private static final Singleton INSTANCE = new Singleton(); private Singleton() {} public static Singleton getInstance() { return INSTANCE; } }- 双重检查锁:
public class Singleton { private volatile static Singleton instance; private Singleton() {} public static Singleton getInstance() { if (instance == null) { synchronized (Singleton.class) { if (instance == null) { instance = new Singleton(); } } } return instance; } }6.2 工厂模式
简单工厂示例:
public class ShapeFactory { public Shape getShape(String shapeType) { if (shapeType == null) return null; if (shapeType.equalsIgnoreCase("CIRCLE")) { return new Circle(); } else if (shapeType.equalsIgnoreCase("RECTANGLE")) { return new Rectangle(); } return null; } }7. JVM调优实战
7.1 常见JVM参数
堆内存设置:
- -Xms:初始堆大小
- -Xmx:最大堆大小
- -Xmn:新生代大小
GC日志参数:
- -XX:+PrintGCDetails
- -XX:+PrintGCDateStamps
- -Xloggc:/path/to/gc.log
7.2 OOM问题排查
内存泄漏定位步骤:
- 使用jmap生成堆转储文件
- 使用MAT或VisualVM分析堆转储
- 查找占用内存最大的对象
- 分析对象的引用链
常见OOM类型:
- Java heap space
- PermGen space/Metaspace
- Unable to create new native thread
- GC overhead limit exceeded
8. 面试实战技巧
8.1 问题回答策略
STAR法则:
- Situation:问题背景
- Task:你的任务
- Action:采取的行动
- Result:取得的结果
技术问题回答结构:
- 先给出简明定义
- 解释核心原理
- 结合实际应用场景
- 可能的问题和解决方案
8.2 编码题解题思路
解题步骤:
- 明确问题需求
- 分析输入输出
- 设计算法思路
- 考虑边界条件
- 编写代码实现
- 测试验证
常用算法:
- 排序算法
- 查找算法
- 动态规划
- 回溯算法
- 贪心算法
9. 常见问题与解决方案
9.1 HashMap相关问题
HashMap工作原理:
- 基于哈希表实现
- 使用链表/红黑树解决哈希冲突
- 扩容机制:负载因子默认0.75
为什么重写equals要重写hashCode:
- 保证对象相等时hashCode相同
- 否则会导致HashMap等集合无法正常工作
9.2 线程池使用问题
核心参数:
- corePoolSize
- maximumPoolSize
- keepAliveTime
- workQueue
- threadFactory
- handler
拒绝策略:
- AbortPolicy(默认)
- CallerRunsPolicy
- DiscardPolicy
- DiscardOldestPolicy
10. 进阶学习建议
源码阅读:
- JDK核心类库源码
- 常用框架源码(Spring、MyBatis等)
性能优化:
- JVM调优
- 数据库优化
- 缓存策略
分布式系统:
- 分布式锁
- 分布式事务
- 消息队列
在实际面试准备过程中,建议结合具体项目经验来理解这些概念,面试官往往更看重候选人能否将理论知识应用到实际问题解决中。对于每个知识点,不仅要知其然,更要知其所以然,这样才能在面试中游刃有余。