26年2月极兔极致供应链 Java开发工程师 一面

1. Java中“值传递”本质:对象作为参数传递时,修改属性为何外部可见?

思路

先明确Java“值传递”的核心(传递的是变量的副本),再区分“对象引用副本”和“对象本身”的关系。

回答示例

Java只有值传递,对象作为参数传递时的核心逻辑:

  1. 值传递的本质:传递的是“对象引用的副本”(而非对象本身),比如void test(User u),传入的是u这个引用变量的副本,两个引用都指向堆中同一个对象;
  2. 修改属性外部可见的原因

一句话总结:传递的是引用副本,修改副本指向的对象属性,等同于修改原对象;修改副本本身,与原对象无关。

2. CopyOnWriteArrayList写操作全程加锁,为何读操作无需加锁?

思路

核心讲“写时复制”机制,读操作访问的是不可变的旧数组,无线程安全问题。

回答示例

CopyOnWriteArrayList的核心是写时复制(COW),读无需加锁的原因:

  1. 写操作逻辑
  2. 读操作逻辑

代价:写操作有复制数组的性能开销,适合读多写少场景。

3. ThreadLocal内存泄漏的根源:弱引用仅作用于Key,Value如何清理?

思路

先讲ThreadLocalMap的结构(Key=弱引用ThreadLocal,Value=强引用),再讲Value泄漏的原因和清理机制。

回答示例

1. 内存泄漏根源

ThreadLocalMap中:

  • Key:对ThreadLocal的弱引用(GC时若无强引用指向ThreadLocal,Key会被回收);
  • Value:对实际值的强引用(即使Key被回收,Value仍被ThreadLocalMap强引用,无法回收);
  • 最终导致:ThreadLocalMap中出现“Key为null、Value不为null”的无效条目,长期占用内存→内存泄漏。

2. Value的清理机制

  1. 主动清理:调用ThreadLocal.remove(),会删除当前ThreadLocal对应的Key和Value,是最推荐的方式;
  2. 被动清理

核心建议:使用完ThreadLocal后务必调用remove(),尤其是线程池场景。

4. JDK8后方法区由元空间实现,元空间内存溢出的典型触发场景?

思路

先讲元空间存储内容(类元数据、常量池等),再分析溢出的核心场景(类加载过多、内存限制过小)。

回答示例

元空间(Metaspace)存储类的元数据(类结构、方法、字段)、运行时常量池等,溢出的典型场景:

  1. 频繁动态生成类
  2. 热部署频繁
  3. 元空间内存限制过小
  4. 框架/中间件类加载异常

溢出表现:抛出java.lang.OutOfMemoryError: Metaspace,且频繁触发Full GC(元空间满会触发Full GC)。

5. InnoDB聚簇索引中,二级索引的叶子节点存储什么内容?

思路

先讲聚簇索引(主键索引)的结构,再明确二级索引叶子节点的“主键值”核心内容。

回答示例

InnoDB的聚簇索引(主键索引)叶子节点存储整行数据,二级索引(非主键索引)的叶子节点存储:

  • 主键值(而非整行数据) + 二级索引列的值。

查询流程:

  1. 用二级索引查询时,先找到二级索引叶子节点的主键值;
  2. 再通过主键值去聚簇索引中查找整行数据(回表查询);
  3. 若查询的字段都在二级索引中(覆盖索引),则无需回表。

核心:二级索引依赖主键索引实现,因此InnoDB表建议设置自增主键(减少索引分裂),且主键长度不宜过长(否则二级索引体积过大)。

6. @SpringBootApplication隐含的@EnableAutoConfiguration如何生效?

思路

讲@EnableAutoConfiguration的核心(SpringFactoriesLoader加载自动配置类),结合@SpringBootApplication的注解组合。

回答示例

@SpringBootApplication是组合注解,包含@EnableAutoConfiguration,其生效流程:

  1. 注解触发:@EnableAutoConfiguration通过@Import(AutoConfigurationImportSelector.class)导入自动配置选择器;
  2. 加载配置类:AutoConfigurationImportSelector通过SpringFactoriesLoader扫描所有jar包中META-INF/spring.factories文件,读取org.springframework.boot.autoconfigure.EnableAutoConfiguration对应的自动配置类全限定名;
  3. 条件筛选:Spring对加载的自动配置类,通过@ConditionalOnClass/@ConditionalOnMissingBean等注解做条件判断,仅满足条件的类才会注册到容器;
  4. 生效:符合条件的自动配置类中的@Bean被初始化,完成自动配置(如数据源、Web容器自动配置)。

7. MyBatis二级缓存默认开启吗?跨SqlSession是否共享?

思路

明确默认状态(未开启),再讲二级缓存的作用域(Mapper级)和跨SqlSession共享规则。

回答示例

1. 默认状态

MyBatis二级缓存默认不开启

  • 全局配置:mybatis.configuration.cache-enabled默认true(允许开启二级缓存),但需在Mapper.xml中添加<cache/>或在Mapper接口上加@CacheNamespace才会真正启用;
  • 若未配置<cache/>,二级缓存始终不生效。

2. 跨Sq

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

本专栏在精不在多,内容分为八股文、大厂真实面经,面试通过后将offer和面试题私发给我,可退还专栏的收益部分费用。欢迎大家共建专栏

全部评论

相关推荐

03-16 11:07
南开大学 Java
牛马人的牛马人生:快手卡实习经历的
点赞 评论 收藏
分享
03-15 10:59
已编辑
美团_后端开发(实习员工)
爱写代码的菜code...:哎,自己当时拿到字节offer的时候也在感叹终于拿到了,自己当时最想去的企业就是字节,结果还是阴差阳错去了鹅厂。祝uu一切顺利!!!
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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