JAVA 高级工程师面试题和答案——掌握这1篇就够了

内容分享20小时前发布
0 0 0

本文涵盖JAVA高级工程师面试题的6大部分值得收藏学习:

  1. Java基础核心知识点
  2. JVM与内存管理和性能调优
  3. 并发与多线程
  4. Spring框架 Spring Cloud Alibaba,Spring AI Alibaba
  5. 数据库与优化
  6. 设计模式与架构
  7. 高频附加题

一、Java基础 核心知识点

  1. 多态的实现原理?
    多态通过方法表(虚方法表)实现。JVM在类加载时建立方法表,子类重写父类方法后,方法表中对应条目指向子类实现。运行时根据对象的实际类型调用对应方法,实现动态绑定。

  1. synchronized和Lock的区别?

synchronized是关键字,自动释放锁;Lock需手动释放,提供更灵活的锁机制(如公平锁、可中断锁)。

Lock支持多条件变量,synchronized通过wait/notify实现单一条件。

  1. HashMap的线程安全问题及优化

线程不安全表现:多线程扩容时可能引发死循环(JDK1.7链表头插法)、数据覆盖。

JDK1.8优化:链表长度>8时转红黑树(时间复杂度O(logn)),解决哈希冲突性能问题。

  1. 为什么重写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

JAVA 高级工程师面试题和答案——掌握这1篇就够了


二、JVM与内存管理和性能调优

  1. 内存泄漏与OOM排查

常见缘由:静态集合持有对象、未关闭资源(如数据库连接)、内部类引用外部类。

排查工具:jmap生成堆转储文件,MAT分析对象引用链;jstack定位线程问题。

  1. CMS与G1 LAJI回收器区别

CMS:基于标记-清除算法,低停顿但内存碎片多,适用于老年代。

G1:分代+分区设计,可预测停顿时间,整体采用标记-整理算法,适合大堆内存。

  1. 类加载机制与双亲委派

过程:加载→链接(验证、准备、解析)→初始化。

双亲委派优点:避免重复加载,保护核心类不被篡改(如java.lang.String)。

  1. 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:内存分析工具,用于排查内存泄漏。


三、并发与多线程

  1. 线程池核心参数
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框架

  1. Spring AOP失效场景?

同类方法内部调用(未通过代理对象)、静态方法、final方法。

解决方案:使用AopContext.currentProxy()获取代理对象。

  1. Spring Boot自动配置原理
    @EnableAutoConfiguration通过META-INF/spring.factories加载配置类,条件注解(如@ConditionalOnClass)决定是否生效
    10
  2. Spring事务传播机制

PROPAGATION_REQUIRED(默认):当前有事务则加入,否则新建。

PROPAGATION_REQUIRES_NEW:始终新建事务,挂起当前事务1014

  1. Spring的核心功能
  • IOC(控制反转):通过依赖注入实现对象间的解耦。
  • AOP(面向切面编程):在不修改源代码的情况下,动态添加功能,如事务管理。

5.Spring事务管理

  • 隔离级别:包括读未提交、读已提交、可重复读和串行化。
  • 传播行为:如REQUIRED、REQUIRES_NEW等12

6.Spring MVC执行流程

  1. 用户请求发送到前端控制器。
  2. 前端控制器调用处理器映射器。
  3. 处理器映射器找到处理器并返回给前端控制器。
  4. 前端控制器调用处理器适配器。
  5. 处理器适配器调用具体处理器。
  6. 处理器返回结果给前端控制器。
  7. 前端控制器将结果传递给视图解析器。
  8. 视图解析器解析后返回视图。
  9. 前端控制器渲染视图并响应用户。

Spring Cloud Alibaba

核心组件与原理

  1. 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配置中心实现实时生效,无需重启服务。

JAVA 高级工程师面试题和答案——掌握这1篇就够了

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

六、设计模式与架构

  1. 单例模式实现

双重检查锁(DCL):需配合volatile防止指令重排序。

枚举单例:线程安全且防反射破坏。

  1. 工厂模式应用场景

解耦对象创建与使用(如Spring的BeanFactory)。

支持扩展,新增产品时无需修改客户端代码。

  1. 常用设计模式
  • 单例模式:确保一个类只有一个实例。
  • 工厂模式:解耦对象的创建与使用。
  • 观察者模式:实现对象间的消息传递15

4.线程池的优势

  • 降低资源消耗。
  • 提高响应速度。
  • 提高线程的可管理性。

七、高频附加题

  1. 为什么wait/notify在Object类中?
    锁是对象级别的,每个对象关联一个监视器,wait/notify需在同步代码块中操作对象锁,而非线程本身
    16
  2. Java为何不支持多继承?
    避免菱形继承问题(如方法冲突),通过接口实现多继承语义(接口允许多实现)
    16
© 版权声明

相关文章

暂无评论

none
暂无评论...