以下是这些面试题的简短回答:
一、后台一面题
1. SpringBoot加载过程
启动类触发 SpringApplication.run() ,依次完成:初始化环境→加载配置→创建上下文→扫描Bean→自动装配→启动嵌入式容器。
2. 循环依赖
Spring通过三级缓存解决(单例Bean):缓存 BeanDefinition →提前暴露未完全初始化的Bean→最终初始化后替换缓存;非单例需手动解(如懒加载、依赖注入改为 @Lazy )。
3. 多线程+线程池参数+流程
- 原理:基于Thread/Runnable,线程池通过复用线程减少创建开销;
- 核心参数:核心线程数、最大线程数、空闲超时、队列容量、拒绝策略;
- 流程:任务先入核心线程→满则入队列→队列满则开最大线程→仍满则触发拒绝策略。
4. Redis数据结构及用途
- String:缓存、计数器;
- Hash:存储对象(如用户信息);
- List:消息队列、最新列表;
- Set:去重、交集/并集(如共同好友);
- ZSet:排序场景(如排行榜)。
5. Kafka消息丢失
- 生产者:开启ack=all、重试机制;
- 消费者:关闭自动提交,消费完成后手动提交;
- 服务端:配置副本数≥2,确保分区副本同步。
6. MySQL调优+聚簇/非聚簇索引+回表/覆盖查询
- 调优:加索引、分库分表、优化SQL、调整缓存;
- 聚簇索引:InnoDB主键索引,叶子节点存整行数据;非聚簇索引:叶子节点存主键;
- 回表:非聚簇索引查完需查主键索引取数据;覆盖查询:索引包含所有需查字段,无需回表。
7. HashMap
基于数组+链表/红黑树实现,默认初始容量16,负载因子0.75;线程不安全,扩容时可能出现环链(JDK7)。
8. Synchronized 和 Lock
- Synchronized:JVM层面锁,自动释放,可修饰方法/代码块;
- Lock:API层面锁,需手动 lock() / unlock() ,支持公平锁、可中断、超时等。
9. 分布式锁
常用Redis( setnx +过期时间)或ZooKeeper(临时节点)实现,保证分布式环境下资源互斥访问。
二、后台二面题
1. GC垃圾回收
分代回收:新生代用复制算法(Eden+Survivor),老年代用标记-清除/整理算法;常见收集器:Serial、Parallel、CMS、G1。
2. Kafka消息丢失(补充)
还需注意:生产者避免异步发送无回调,消费者避免消费速度慢导致重平衡丢失偏移量。
3. Redis(补充)
除数据结构,还需关注:持久化(RDB/AOF)、缓存击穿/穿透/雪崩及解决方案。
4. 与供应商沟通数据生产问题
先明确问题(复现步骤、日志)→ 同步双方数据链路→ 约定排查节点→ 输出整改方案+时间节点,全程留文档。
5. 数据幂等
通过唯一ID(如订单号)+ 状态标记(如“已处理”)实现,Redis/数据库做幂等校验。
6. 文件传输Md5
发送方计算文件Md5,接收方校验Md5,确保文件传输完整无篡改。
7. Aes对称加密
对称加密算法,加密解密用同一密钥,特点是速度快,适合大数据量加密。
浙公网安备 33010602011771号