阿里淘天 Java 后端一面面经

1. 先做个自我介绍,再重点讲一个你参与最深的项目模块。

答:

这个问题几乎是必问,面试官主要不是听你“讲故事”,而是看你表达是否清晰、项目是不是你真的做过。比较好的回答方式是按这几个点展开:

  1. 个人背景:毕业时间、工作年限、当前技术栈。
  2. 项目背景:这个项目解决什么业务问题,面向谁。
  3. 自己负责什么:不要只说“参与了开发”,而要明确到模块,比如订单、库存、营销、支付、搜索推荐等。
  4. 技术细节:用了哪些中间件、数据库、缓存、消息队列。
  5. 难点和结果:遇到过什么问题,怎么解决,最后指标提升了多少。

比如可以这样答:

“我主要做 Java 后端开发,平时技术栈是 Spring Boot、MySQL、Redis、MQ。最近做得比较深的是一个订单履约模块,我主要负责订单状态流转、库存扣减和异步通知这一块。这个模块的难点主要在高并发下的数据一致性和接口响应时间优化,后来我们通过缓存、异步解耦和 SQL 优化,把接口 RT 从 300ms 降到了 100ms 左右,同时把库存超卖问题控制住了。”

这个问题回答好,后面很多追问都会围绕你项目展开,所以建议提前准备。

2. MySQL 联合索引为什么要遵循最左前缀匹配原则?

答:

联合索引本质上是按照多个字段组合建立出来的有序结构,比如 (a, b, c)。它在底层排序时,先按 a 排,再按 b 排,最后按 c 排。

因此,查询时如果想用上这个索引,必须从最左边开始连续匹配。

例如索引是 (a, b, c)

  • where a = 1:可以用
  • where a = 1 and b = 2:可以用
  • where a = 1 and b = 2 and c = 3:可以用
  • where b = 2 and c = 3:通常不能直接用完整联合索引
  • where a = 1 and c = 3:一般只能用到 a

原因是底层 B+ 树先按最左列组织,如果跳过了最左列,后面的有序性就无法充分利用。

所以建联合索引时,一般要把区分度高、过滤能力强、最常用作查询条件的字段放前面

3. explain 里面常见的几个字段你怎么理解?怎么判断 SQL 有没有走好索引?

答:

explain 是排查 SQL 性能的常用工具,面试里经常问。几个重点字段可以这样理解:

  1. type:访问类型,性能从好到差大致是 system > const > eq_ref > ref > range > index > all。 如果看到 all,通常说明全表扫描,性能较差。
  2. key:实际使用的索引。
  3. rows:MySQL 预估要扫描的行数,越少越好。
  4. Extra:额外信息。 常见的有: Using index:说明使用了覆盖索引,比较好Using where:说明还需要做条件过滤Using filesort:说明排序没利用索引,可能性能差Using temporary:说明用了临时表,通常也要关注

判断 SQL 是否优化得比较好,一般看几个点:

  • 有没有命中合适索引
  • type 至少不要太差
  • 扫描行数是不是明显过多
  • 有没有 filesorttemporary
  • 是否存在回表过多的问题

4. 什么是索引下推?它解决了什么问题?

答:

索引下推(ICP,Index Condition Pushdown)可以理解为:在索引遍历阶段就尽可能多做条件过滤,减少回表次数

比如有联合索引 (name, age),SQL 是:

select * from user where name like 'zhang%' and age = 20;

如果没有索引下推,MySQL 可能先根据 name 找到一批记录,然后一条条回表,再判断 age = 20

有了索引下推后,在索引层就能先过滤 age = 20,只有满足条件的才回表,这样能减少很多无效 IO。

它的核心价值就是:

减少回表,减少磁盘访问,提高查询效率。

5. Spring 中 Bean 是如何被创建出来的?大致流程是什么?

答:

这个问题本质上是在问 Spring IOC 容器启动和 Bean 创建流程。可以按顺序回答:

  1. 读取配置Spring 启动时会先读取 XML、注解、Java Config 等配置信息,把这些定义解析成 BeanDefinition。BeanDefinition 可以理解为 Bean 的“配方”,里面描述了类名、作用域、依赖、初始化方法等信息。
  2. 实例化 Bean容器根据 BeanDefinition 反射创建对象。如果是构造器注入,这一步会先选择合适的构造方法。
  3. 属性注入把依赖对象注入到 Bean 中,比如 @Autowired、@Resource 标注的属性或方法。
  4. Aware 回调如果 Bean 实现了 BeanNameAware、BeanFactoryAware、ApplicationContextAware 等接口,Spring 会回调这些方法,把容器相关信息传进去。
  5. BeanPostProcessor 前置处理初始化前执行 postProcessBeforeInitialization()。
  6. 初始化执行 InitializingBean.afterPropertiesSet() 或自定义 init-method。
  7. BeanPostProcessor 后置处理初始化后执行 postProcessAfterInitialization()。AOP 代理对象很多就是在这个阶段生成的。
  8. 放入单例池如果是单例 Bean,会放到单例缓存里,后面直接复用。

整体上,Spring IOC 的核心思想就是:

对象的创建、依赖管理、生命周期都交给容器统一管理。

6. Spring 事务底层是怎么实现的?为什么有时候会失效?

答:

Spring 事务本质上是通过 AOP + 代理 实现的。

当你在方法上加 @Transactional 时,Spring 并不是直接修改这个方法,而是为这个 Bean 创建一个代理对象。

调用这个代理对象的方法时,会先进入事务拦截逻辑:

  1. 开启事务
  2. 执行目标方法
  3. 如果正常结束就提交事务
  4. 如果抛出符合规则的异常就回滚事务

常见事务失效场景有这些:

  1. 同类自调用一个类里的方法 A 调用本类另一个加了事务的方法 B,通常事务不生效。因为这不是通过代理对象调用,而是对象内部直接调用。
  2. 方法不是 public默认情况下,很多事务代理只拦截 public 方法。
  3. 异常被吞掉如果方法内部捕获了异常却不继续抛出,Spring 感知不到异常,就不会回滚。
  4. 抛出的不是默认回滚异常默认只对 RuntimeException 和 Error 回滚。如果抛的是受检异常,可能要显式指定 rollbackFor。
  5. 没有被 Spring 管理如果对象不是 Spring 容器里的 Bean,事务注解也不会生效。

面试回答时,关键是强调:

S

剩余60%内容,订阅专栏后可继续查看/也可单篇购买

Java面试圣经 文章被收录于专栏

Java面试圣经,带你练透java圣经

全部评论

相关推荐

今天 12:03
已编辑
华东师范大学 Java
一面 (3.30)1.CQRS介绍2.分布式事务有哪些 优缺点3.Seata AT 跟 kafka加本地消息表 对比4.聚簇索引跟非聚簇索引5.回表是什么?6.MVCC机制7.Redis的几种持久化机制8.算法 二维DP   二维网格 0 表示路 1 表示障碍 求能否从0,0 走到 n-1,m-1当天约二面二面 (4.01)1.围绕项目问DDD四层架构,为什么使用DDD ?2.四层相比三层的优势3.CQRS是怎么使用的?4.多级缓存一致性怎么保证的?5.网关调用应该放在代码结构的哪里?拿到数据之后的逻辑又应该放在哪里?6.算法 字符串解码 leetcode 394  追问如果是流式输入怎么办(非常长,无法等到终止符)?面试官临时有事 三面拖到清明后三面 (4.07)1.项目部署上线了吗? 是自发开发的吗?2.项目的难点? 怎么进行秒杀场景的建模3.DDD的好处有哪些?4.DDD的应用场景是那些?5.DDD跟微服务的关系?6.充血模型对比贫血模型7.项目CQRS解决了哪些问题?8.使用过AI coding 吗?一般怎么使用的9.你觉得在AI时代下 后端的核心竞争力是什么?10.读研跟工作怎么选择?为什么?三面完了,过了几天告诉我上海没HC了 让我转Base直接三面 还是同一个岗位四面 (4.14)1.挑一个项目讲讲2.分布式事务怎么解决的3.Seata简单介绍一下 干什么用的4.秒杀怎么保证并发安全的5.怎么设计一个高性能的分布式锁 会遇到哪些问题?6.消息可靠性怎么保证7.ISR副本是什么,有什么用8.Kafka高性能的原因9.Raft跟Paxos的区别10.Lua脚本怎么保证原子性11.MySQL索引为什么用B+树,跟B树相比优势在哪12.Leetcode 152 乘积最大的子数组 要求输出对应的起始结束下标13.Leetcode 4 寻找两个正数数组的中位数 复杂度要求log(n+m)14.思维题: 一个可以产生很多随机数的计算机 怎么用它估算圆周率面完当天过  又告诉我表现的不错要给我加面(表现的不错加什么面试。。。)五面 (4.15)1.开局聊天 什么时候到岗,这学期有什么课2.DDD是什么3.DDD的模型怎么跟接口,数据库进行交互4.数据模型跟领域模型怎么交互5.秒杀场景怎么使用DDD进行建模6.Raft跟Paxos的区别7.设计一个点赞系统8.分布式的环境下怎么提高点赞的并发量(分片即可)9.如果要降低成本怎么修改方案 (冷热分离即可)10.为什么redis快?11.Mysql所有数据都是直接写入磁盘吗? (BufferPool 以及 WAL 技术)12.那为什么redo log也是直接写磁盘  但就是比数据写入快呢?(环形缓冲区,顺序写入)13.算法 是一道贪心+堆的组合 不算难面完秒过HR面(4.16)告诉我面试全部通过  目前等OC中  许愿OC
发面经攒人品
点赞 评论 收藏
分享
04-14 16:56
门头沟学院 Java
点赞 评论 收藏
分享
评论
2
4
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务