一、HashMap实现原理与并发问题
核心机制
1. 哈希冲突解决方案:采用数组+链表+红黑树结构(JDK1.8+),当链表长度超过阈值(默认8)时转为红黑树,提升查询效率
2. 扩容机制:当元素数量超过负载因子(0.75)*容量时,触发扩容为原数组2倍,rehash过程涉及数据迁移
3. 并发隐患:多线程环境下可能导致环形链表(JDK1.7)或死循环(JDK1.8之前版本)
java
// 并发修改异常示例
Map<Integer, String> map = new HashMap<>();
new Thread(() -> map.put(1, "A")).start();
new Thread(() -> map.put(2, "B")).start(); // 可能抛出ConcurrentModificationException
二、线程池参数配置与拒绝策略
核心参数解析
java
ExecutorService executor = new ThreadPoolExecutor(
corePoolSize, // 核心线程数
maximumPoolSize, // 最大线程数
keepAliveTime, // 空闲线程存活时间
TimeUnit.SECONDS,
new LinkedBlockingQueue<>(queueCapacity), // 任务队列
new ThreadPoolExecutor.CallerRunsPolicy() // 拒绝策略
);
关键点
1. 队列选择:SynchronousQueue适合高吞吐场景,LinkedBlockingQueue适合任务执行时间差异大的场景
2. 拒绝策略:
- AbortPolicy(默认):直接抛出RejectedExecutionException
- CallerRunsPolicy:由提交线程执行任务
- DiscardOldestPolicy:丢弃队列头部任务
- DiscardPolicy:静默丢弃任务
三、JVM内存模型与垃圾回收
内存分区
1. 堆内存:新生代(Eden+S0/S1)与老年代
2. 方法区:存储类元数据(JDK8后使用元空间)
3. 本地方法栈:执行Native方法
4. 程序计数器:线程私有执行指针
垃圾回收算法
- 标记-清除:基础算法,产生内存碎片
- 复制算法:新生代常用,分From/To空间
- 标记-整理:老年代适用,解决碎片问题
- 分代收集:结合不同区域特点的混合策略
四、异常处理机制与最佳实践
三类异常
1. Checked Exception:编译期检查异常(IOException)
2. RuntimeException:运行时异常(NullPointerException)
3. Error:严重系统错误(OutOfMemoryError)
处理原则
1. 避免捕获过于宽泛的Exception
2. finally块中避免资源泄露
3. try-with-resources处理自动关闭资源
java
// 正确的资源管理示例
try (FileInputStream fis = new FileInputStream("test.txt")) {
// 业务逻辑
} catch (IOException e) {
logger.error("文件读取失败", e);
}
五、设计模式面试题精讲
工厂模式
- 简单工厂:通过参数决定创建对象类型
- 抽象工厂:生产产品族,符合开闭原则
单例模式
1. 饿汉式:类加载时初始化
2. 双重校验锁:volatile+双重检查保证线程安全
3. 静态内部类:利用类加载机制保证线程安全
java
// 双重校验锁实现
public class Singleton {
private static volatile Singleton instance;
public static Singleton getInstance() {
if (instance == null) {
synchronized (Singleton.class) {
if (instance == null) {
instance = new Singleton();
}
}
}
return instance;
}
}