链接双端链表:

前一篇:AI出题人给出的Java后端面经(一)(日更)

后一篇:AI出题人给出的Java后端面经(三)(日更)

目录

🔵 一、Java 基础

题目:Java 中 String 类的不可变性(Immutable)是如何实现的?这种设计带来了哪些优点?同时,解释为什么在大量字符串拼接场景下推荐使用 StringBuilder 而不是 + 操作符?

🗃️ 二、持久化层 (MySQL)

题目:列举至少 5 种常见的 MySQL 索引失效场景(例如:对索引列使用函数),并针对每种场景简要说明失效原因及优化方案。

⚙️ 三、中间件

a) 消息队列 (RabbitMQ)

题目:RabbitMQ 的 Exchange 类型(Direct/Fanout/Topic/Headers)分别有什么特点?请描述生产者发送消息到消费者接收的完整流程(需包含 Exchange、RoutingKey、Queue 的绑定关系)。

b) Redis

题目:什么是 Redis 缓存雪崩?与缓存击穿有何本质区别?请给出 三种预防雪崩 的有效方案(如数据预热、随机过期时间等),并说明每种方案的实现原理。

🧠 四、JVM

题目:对比说明 JVM 中三种垃圾回收算法的核心思想:标记-清除(Mark-Sweep)、标记-复制(Mark-Copy)、标记-整理(Mark-Compact)并分析每种算法的 空间效率缺陷 和 适用场景(如年轻代/老年代)。

⚡ 五、Java 并发

题目:ThreadPoolExecutor 的 核心构造参数 有哪些(至少说出5个)?请描述当新任务提交时,线程池的 完整工作流程(从任务提交到进入阻塞队列,再到创建新线程的触发条件)。

🌱 六、Spring 框架

题目:描述 Spring Bean 的 完整生命周期(从实例化到销毁),需包含以下关键阶段:

📌 今日总结:


🔵 一、Java 基础

题目:
Java 中 String 类的不可变性(Immutable)是如何实现的?这种设计带来了哪些优点?同时,解释为什么在大量字符串拼接场景下推荐使用 StringBuilder 而不是 + 操作符?

答案:

  1. 不可变性实现:

    • String 类内部用 final char[] value 存储数据。

    • 类本身为 final 禁止继承。

    • 修改操作(如 concat())均返回新对象而非修改原对象。

  2. 优点:

    • 线程安全(无需同步)。

    • 缓存Hash值(提升 HashMap 等性能)。

    • 安全性(防止篡改,如网络连接、文件路径)。

  3. 拼接场景优化:

    • + 操作符编译后实质是 StringBuilder.append(),但循环拼接时会在每次循环创建新 StringBuilder 对象(性能差)。

    • 直接使用 StringBuilder 全程复用同一个缓冲区,减少对象创建。

🗃️ 二、持久化层 (MySQL)

题目:
列举至少 5 种常见的 MySQL 索引失效场景(例如:对索引列使用函数),并针对每种场景简要说明失效原因及优化方案。


 答案:

索引失效场景失效原因优化方案
1. 对索引列使用函数WHERE YEAR(create_time)=2023改用范围查询:BETWEEN '2023-01-01' AND '2023-12-31'
2. 隐式类型转换列 varchar,查询 WHERE id=100(int转string)统一类型:WHERE id='100'
3. LIKE 以通配符开头WHERE name LIKE '%abc'改用覆盖索引 / 全文索引
4. OR 条件未全覆盖WHERE a=1 OR b=2,仅a有索引为b加索引 / 拆分为UNION查询
5. 违反最左前缀原则联合索引 (a,b,c),查询 WHERE b=1 AND c=2调整查询顺序或补充缺失列

⚠️ 其他场景:索引列数学运算、!= / NOT IN 查询、JOIN字段字符集不一致。

⚙️ 三、中间件

a) 消息队列 (RabbitMQ)

题目:
RabbitMQ 的 Exchange 类型(Direct/Fanout/Topic/Headers)分别有什么特点?请描述生产者发送消息到消费者接收的完整流程(需包含 Exchange、RoutingKey、Queue 的绑定关系)。

答案:

Exchange类型特点路由规则
Direct精确匹配RoutingKey 完全相等 才转发
Fanout广播模式忽略 RoutingKey,所有绑定队列都接收
Topic通配符匹配RoutingKey 支持 *(单词) #(多词)
Headers基于消息头匹配(少用)指定 key-value 匹配规则

消息流转流程:

  1. 生产者发送消息到 Exchange,指定 RoutingKey。

  2. Exchange 根据 类型 + Binding规则 将消息路由到 Queue。

  3. 消费者监听 Queue 获取消息。

b) Redis

题目:
什么是 Redis 缓存雪崩?与缓存击穿有何本质区别?请给出 三种预防雪崩 的有效方案(如数据预热、随机过期时间等),并说明每种方案的实现原理。


 答案:

  • 缓存雪崩:大量Key同时过期,导致请求全部穿透到数据库(压垮DB)。

  • vs 缓存击穿:雪崩是多个Key同时失效,击穿是单个热点Key失效。

  • 预防方案:

    1. 随机过期时间:TTL = base_time + random(0, 300s),分散过期时间。

    2. 数据预热:系统启动时加载高频数据,并设置合理过期时间。

    3. 熔断降级:使用 Hystrix 等组件在DB压力大时返回默认值。

    4. 集群部署:Redis 主从+哨兵,避免单点故障。

🧠 四、JVM

题目:
对比说明 JVM 中三种垃圾回收算法的核心思想:标记-清除(Mark-Sweep)、标记-复制(Mark-Copy)、标记-整理(Mark-Compact)
并分析每种算法的 空间效率缺陷 和 适用场景(如年轻代/老年代)。


 答案:

垃圾回收算法核心思想空间缺陷适用场景
标记-清除标记存活对象 → 清除未标记对象内存碎片严重CMS老年代回收
标记-复制内存分两块,存活对象复制到另一半浪费50%空间新生代(Survivor区)
标记-整理标记存活对象 → 向一端移动 → 清理边界整理耗时高老年代(Serial Old / G1)

新生代选择复制算法:因对象“朝生夕死”,存活对象少,复制成本低。

⚡ 五、Java 并发

题目:
ThreadPoolExecutor 的 核心构造参数 有哪些(至少说出5个)?请描述当新任务提交时,线程池的 完整工作流程(从任务提交到进入阻塞队列,再到创建新线程的触发条件)。


答案:

   核心构造参数:

  • corePoolSize(核心线程数)
  • maximumPoolSize(最大线程数)
  • keepAliveTime(空闲线程存活时间)
  • unit(时间单位)
  • workQueue(阻塞队列,如 LinkedBlockingQueue)
  • threadFactory(线程工厂)
  • handler(拒绝策略,如 AbortPolicy)

  任务提交流程图:

🌱 六、Spring 框架

题目:
描述 Spring Bean 的 完整生命周期(从实例化到销毁),需包含以下关键阶段:

  1. 实例化

  2. 属性填充(依赖注入)

  3. BeanPostProcessor 前置处理

  4. 初始化方法(@PostConstruct 和 InitializingBean)

  5. BeanPostProcessor 后置处理

  6. 销毁(@PreDestroy 和 DisposableBean)
    并说明 @PostConstruct 和 @PreDestroy 注解的执行时机。


答案:
Bean 生命周期流程:

  1. 实例化:通过构造器或工厂方法创建对象。

  2. 属性填充:注入 @Autowired 依赖。

  3. BeanPostProcessor 前置处理:postProcessBeforeInitialization()。

  4. 初始化:

    • 调用 @PostConstruct 注解方法。

    • 实现 InitializingBean 的 afterPropertiesSet()。

    • 自定义 init-method。

  5. BeanPostProcessor 后置处理:postProcessAfterInitialization()(可返回代理对象)。

  6. 销毁:

    • 调用 @PreDestroy 注解方法。

    • 实现 DisposableBean 的 destroy()。

    • 自定义 destroy-method。

执行时机:

  • @PostConstruct:在依赖注入完成后,其他初始化方法前执行。

  • @PreDestroy:在容器关闭时,Bean销毁前执行。

📌 今日总结:

6 大领域共 7 道题,重点关注:

  1. String 底层设计

  2. MySQL 索引优化

  3. RabbitMQ 路由模型

  4. JVM 垃圾回收算法对比

  5. 线程池任务调度流程

  6. Spring Bean 生命周期钩子

更多推荐