本文涵盖JAVA高级工程师面试题的6大部分值得收藏学习:
- Java基础核心知识点
- JVM与内存管理和性能调优
- 并发与多线程
- Spring框架 Spring Cloud Alibaba,Spring AI Alibaba
- 数据库与优化
- 设计模式与架构
- 高频附加题
一、Java基础 核心知识点
- 多态的实现原理?
多态通过方法表(虚方法表)实现。JVM在类加载时建立方法表,子类重写父类方法后,方法表中对应条目指向子类实现。运行时根据对象的实际类型调用对应方法,实现动态绑定。
- synchronized和Lock的区别?
synchronized是关键字,自动释放锁;Lock需手动释放,提供更灵活的锁机制(如公平锁、可中断锁)。
Lock支持多条件变量,synchronized通过wait/notify实现单一条件。
- HashMap的线程安全问题及优化
线程不安全表现:多线程扩容时可能引发死循环(JDK1.7链表头插法)、数据覆盖。
JDK1.8优化:链表长度>8时转红黑树(时间复杂度O(logn)),解决哈希冲突性能问题。
- 为什么重写equals必须重写hashCode?
若两个对象equals相等,其hashCode必须一样,否则在使用HashMap等基于哈希的集合时会导致逻辑错误(如无法正确找到键值)。
5.介绍Java中的可变参数使用场景
可变参数允许方法接受数量不定的参数,语法为int… numbers。在方法内部,可变参数被当作数组处理。例如:
public int sum(int... numbers) {
int sum = 0;
for (int number : numbers) {
sum += number;
}
return sum;
}
- 使用场景:适用于参数数量不确定的情况,如求和、拼接字符串等4。
7.断言(Assertion)
断言用于验证程序的假设条件,如果条件为false,则抛出AssertionError。例如:
assert (principal > 0);
- 使用场景:适用于调试阶段,不提议在生产环境中用于验证输入数据。
8.解释初始化数据块
- 静态初始化块:在类加载时执行,仅运行一次。
- 实例初始化块:在每次创建对象时执行4。

二、JVM与内存管理和性能调优
- 内存泄漏与OOM排查
常见缘由:静态集合持有对象、未关闭资源(如数据库连接)、内部类引用外部类。
排查工具:jmap生成堆转储文件,MAT分析对象引用链;jstack定位线程问题。
- CMS与G1 LAJI回收器区别
CMS:基于标记-清除算法,低停顿但内存碎片多,适用于老年代。
G1:分代+分区设计,可预测停顿时间,整体采用标记-整理算法,适合大堆内存。
- 类加载机制与双亲委派
过程:加载→链接(验证、准备、解析)→初始化。
双亲委派优点:避免重复加载,保护核心类不被篡改(如java.lang.String)。
- LAJI回收(GC)
LAJI回收是Java自动管理内存的机制,JVM会自动回收不再被引用的对象。例如:
void method() {
Calendar calendar = new GregorianCalendar(2000, 10, 30);
System.out.println(calendar);
}
- GC触发条件:堆内存不足、CPU空闲时。
- 最佳实践:避免使用finalize()方法,尽量通过System.gc()请求GC。
5.JVM内存模型
- 堆:存放对象实例。
- 虚拟机栈:存储方法调用的局部变量和操作栈。
- 方法区:存储类元数据信息。
- 程序计数器:记录当前线程执行的字节码行号15。
6.JVM调优工具
- JConsole:JDK自带,功能简单。
- VisualVM:功能强劲,支持内存和线程分析。
- MAT:内存分析工具,用于排查内存泄漏。
三、并发与多线程
- 线程池核心参数
ThreadPoolExecutor(
int corePoolSize, // 核心线程数
int maximumPoolSize, // 最大线程数
long keepAliveTime, // 空闲线程存活时间
TimeUnit unit, // 时间单位
BlockingQueue<Runnable> workQueue, // 任务队列
ThreadFactory threadFactory, // 线程工厂
RejectedExecutionHandler handler // 拒绝策略
)
2.拒绝策略:AbortPolicy(默认抛异常)、CallerRunsPolicy(由提交线程执行任务)。
3.volatile关键字作用
保证可见性:修改后立即刷新到主内存。
禁止指令重排序(通过内存屏障实现)。
4.AQS原理
AbstractQueuedSynchronizer通过CLH队列管理线程竞争资源,实现锁的获取与释放(如ReentrantLock)。
5.线程的生命周期
线程的生命周期包括
新建(New)、
就绪(Runnable)、
运行(Running)、
阻塞(Blocked)
死亡(Dead)五种状态。
6.等待与通知机制
- wait()、notify()和notifyAll()方法定义在Object类中,由于它们依赖于对象的监视器锁,而不是线程本身14。
- 使用场景:用于线程间的通信,如生产者-消费者模型14。
四、Spring框架
- Spring AOP失效场景?
同类方法内部调用(未通过代理对象)、静态方法、final方法。
解决方案:使用AopContext.currentProxy()获取代理对象。
- Spring Boot自动配置原理
@EnableAutoConfiguration通过META-INF/spring.factories加载配置类,条件注解(如@ConditionalOnClass)决定是否生效10。 - Spring事务传播机制
PROPAGATION_REQUIRED(默认):当前有事务则加入,否则新建。
PROPAGATION_REQUIRES_NEW:始终新建事务,挂起当前事务1014。
- Spring的核心功能
- IOC(控制反转):通过依赖注入实现对象间的解耦。
- AOP(面向切面编程):在不修改源代码的情况下,动态添加功能,如事务管理。
5.Spring事务管理
- 隔离级别:包括读未提交、读已提交、可重复读和串行化。
- 传播行为:如REQUIRED、REQUIRES_NEW等12。
6.Spring MVC执行流程
- 用户请求发送到前端控制器。
- 前端控制器调用处理器映射器。
- 处理器映射器找到处理器并返回给前端控制器。
- 前端控制器调用处理器适配器。
- 处理器适配器调用具体处理器。
- 处理器返回结果给前端控制器。
- 前端控制器将结果传递给视图解析器。
- 视图解析器解析后返回视图。
- 前端控制器渲染视图并响应用户。
Spring Cloud Alibaba
核心组件与原理
- Spring Cloud Alibaba的核心组件及作用
- Nacos:服务注册与发现、动态配置管理(支持AP/CP模式,基于Netty实现通信,集群数据同步使用Distro协议)。
- Sentinel:流量控制、熔断降级(支持滑动窗口、令牌桶等限流算法,提供熔断状态的动态切换)。
- Seata:分布式事务解决方案(支持AT、TCC、Saga模式,通过全局事务ID(XID)传递实现跨服务事务管理)。
- RocketMQ:集成Spring Cloud Stream的消息中间件,用于异步通信和解耦。
2.Nacos的底层实现原理
- 服务注册与发现:客户端通过心跳机制向Nacos Server注册实例,服务端基于内嵌数据库(如Derby或MySQL)存储元数据,集群节点间通过Distro协议同步数据3。
- 配置管理:支持动态配置推送,客户端通过长轮询监听配置变更,结合@RefreshScope实现热更新。
3.Sentinel的限流算法及熔断流程
限流算法:
① 固定窗口计数器(临界值问题);
② 滑动窗口计数器(优化临界问题);
③ 漏桶算法(平滑流量);
④ 令牌桶算法(允许突发流量)310。
熔断流程:
Closed:正常调用;
Open:触发熔断,直接执行Fallback;
Half-Open:尝试部分请求,成功率达标则恢复
对比分析与应用场景
Nacos vs Eureka vs Zookeeper
一致性模型:Nacos支持AP/CP,Eureka仅AP,Zookeeper为CP215。
高可用性:Eureka通过自我保护机制防止网络抖动误删实例,Nacos通过集群和Distro协议保障数据同步。
适用场景:
Nacos适合需要动态配置和灵活服务治理的场景;
Zookeeper适合强一致性要求的场景(如分布式锁)。
Feign的性能优化与认证传递
优化策略:
① 替换默认HTTP客户端为OkHttp或HttpClient(支持线程池);
② 开启GZIP压缩减少传输数据量。
认证传递:通过实现RequestInterceptor接口,在请求头中添加Token或认证信息3。
Seata的AT模式与TCC模式对比
AT模式:基于两阶段提交,自动生成反向SQL日志(回滚日志),适合非侵入式事务管理。
TCC模式:需手动实现try-confirm-cancel方法,适合金融等高一致性场景。
分布式系统设计
1.CAP与BASE理论的应用
CAP:Nacos(AP/CP可选)、Eureka(AP)、Zookeeper(CP)。
BASE:通过最终一致性保障高可用,如Seata的AT模式允许短暂数据不一致。
2.分布式事务的典型场景
跨服务调用:订单服务扣库存与支付服务转账需保证原子性(使用Seata的AT模式)。
分库分表:多个数据库操作需全局事务管理(如TCC模式)。
3.Gateway实现灰度发布
权重路由:通过配置Weight断言,动态分配流量比例(如80%流量到新版本)。
动态配置:结合Nacos配置中心实现实时生效,无需重启服务。

https://java2ai.com/ 官网
https://github.com/alibaba/spring-ai-alibaba?spm=5176.29160081.0.0.2856aa5cM6XMNF
五、数据库与优化
1.数据库三范式
- 第一范式(1NF):属性不可分割。
- 第二范式(2NF):非主属性完全依赖于主键。
- 第三范式(3NF):非主属性不能传递依赖于主键15。
2.索引的使用场景
- 创建索引:表常常进行SELECT操作,表数据量大,列常常出目前WHERE子句中。
- 不创建索引:表常常进行INSERT/UPDATE/DELETE操作,表数据量小15。
3.HashMap的红黑树优化
在JDK 1.8中,当链表长度超过8且数组容量大于64时,链表会转换为红黑树,将查询时间复杂度从O(n)降低到O(log n)15。
六、设计模式与架构
- 单例模式实现
双重检查锁(DCL):需配合volatile防止指令重排序。
枚举单例:线程安全且防反射破坏。
- 工厂模式应用场景
解耦对象创建与使用(如Spring的BeanFactory)。
支持扩展,新增产品时无需修改客户端代码。
- 常用设计模式
- 单例模式:确保一个类只有一个实例。
- 工厂模式:解耦对象的创建与使用。
- 观察者模式:实现对象间的消息传递15。
4.线程池的优势
- 降低资源消耗。
- 提高响应速度。
- 提高线程的可管理性。
七、高频附加题
- 为什么wait/notify在Object类中?
锁是对象级别的,每个对象关联一个监视器,wait/notify需在同步代码块中操作对象锁,而非线程本身16。 - Java为何不支持多继承?
避免菱形继承问题(如方法冲突),通过接口实现多继承语义(接口允许多实现)16。




