2025年Java高级工程师面试题
Java基础
1. HashMap原理
问题:HashMap在JDK8中的实现原理?
答案:
- 数组+链表/红黑树结构
- 当链表长度>8且数组长度>64时转为红黑树
- hash计算:
static final int hash(Object key) {
int h;
return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);
}
2. 动态代理
问题:JDK动态代理和CGLIB区别?
答案:
特性 | JDK动态代理 | CGLIB |
---|---|---|
原理 | 基于接口 | 基于继承 |
性能 | 调用稍快 | 生成快 |
限制 | 必须实现接口 | 不能代理final类 |
JVM
3. 类加载机制
问题:双亲委派模型的工作流程?
答案:
- 加载顺序:
- 应用程序类加载器 → 扩展类加载器 → 启动类加载器
- 优势:
- 避免重复加载
- 防止核心API被篡改
4. OOM排查
问题:如何排查Metaspace内存溢出?
答案:
- 参数配置:
-XX:MaxMetaspaceSize=256m
-XX:MetaspaceSize=64m
- 分析工具:
jcmd <pid> GC.heap_dump /path/to/dump.hprof
并发编程
5. volatile关键字
问题:volatile如何保证可见性和有序性?
答案:
- 可见性:
- 写操作立即刷新到主内存
- 读操作从主内存读取
- 有序性:
- 禁止指令重排序
6. AQS原理
问题:AbstractQueuedSynchronizer如何实现锁?
答案:
- 核心结构:
- state变量表示锁状态
- CLH队列管理等待线程
- 获取锁流程:
public final void acquire(int arg) {
if (!tryAcquire(arg) &&
acquireQueued(addWaiter(Node.EXCLUSIVE), arg))
selfInterrupt();
}
数据库
7. 索引失效
问题:哪些情况会导致MySQL索引失效?
答案:
- 常见场景:
- 使用
!=
或<>
操作符 - 对索引列使用函数
- 隐式类型转换
- 最左前缀原则违反
- 使用
8. 事务隔离
问题:MySQL的RR隔离级别如何解决幻读?
答案:
- 解决方案:
- 快照读:通过MVCC
- 当前读:通过Next-Key Lock
- 锁范围:
- 记录锁+间隙锁
Spring框架
9. 循环依赖
问题:Spring如何解决循环依赖?
答案:
- 三级缓存:
- singletonObjects:完整Bean
- earlySingletonObjects:早期引用
- singletonFactories:ObjectFactory
- 解决流程:
// DefaultSingletonBeanRegistry
protected Object getSingleton(String beanName, boolean allowEarlyReference) {
// 检查一级缓存
Object singletonObject = this.singletonObjects.get(beanName);
if (singletonObject == null && isSingletonCurrentlyInCreation(beanName)) {
// 检查二级缓存
singletonObject = this.earlySingletonObjects.get(beanName);
if (singletonObject == null && allowEarlyReference) {
// 检查三级缓存
synchronized (this.singletonObjects) {
// 再次检查...
}
}
}
return singletonObject;
}
10. Bean生命周期
问题:描述Spring Bean的完整生命周期?
答案:
- 主要阶段:
- 实例化 → 属性填充 → Aware接口回调
- 初始化前 → 初始化 → 初始化后
- 使用 → 销毁
- 关键接口:
- BeanPostProcessor
- InitializingBean
- DisposableBean
分布式
11. CAP理论
问题:分布式系统如何权衡CAP?
答案:
- 常见选择:
- CP系统:Zookeeper
- AP系统:Eureka
- 实际应用:
- 金融系统优先CP
- 社交系统优先AP
12. 分布式ID
问题:Snowflake算法原理和优化?
答案:
- 原始结构:
- 1位符号位 + 41位时间戳 + 10位机器ID + 12位序列号
- 优化方案:
- 缩短时间戳位数延长使用年限
- 增加机器ID位数支持更多节点
系统设计
13. 秒杀系统
问题:设计秒杀系统的关键技术点?
答案:
- 核心方案:
- 流量削峰:消息队列
- 库存扣减:Redis+Lua
- 限流措施:令牌桶算法
- 架构示例:
用户 → 网关层 → 限流 → 缓存层 → 队列 → 服务层 → DB
14. 缓存策略
问题:如何保证缓存与数据库的一致性?
答案:
- 常见模式:
- Cache Aside Pattern
- Read/Write Through
- Write Behind
- 最终一致性方案:
- 延时双删
- 监听binlog