卓望Java后端暑期实习一面面经
《面试题目》
- Spring 是如何实现自动装配的?
- Spring 常见注解有哪些?
- 事务注解是如何实现原子性的?
- 常见的设计模式有哪些?(Spring 中使用了什么设计模式)
- 如何创建线程?
- 堆里面有什么?(新生代、老年代)
- Set 中如何判断两个自定义的对象是否一致?
- 集合、索引、事务 ACID 等基础问题
《参考解析》
- Spring 事务注解实现原子性:
@Transactional基于 AOP 动态代理,方法执行前开启数据库事务,方法正常返回后提交事务,若抛出运行时异常(默认配置)则自动回滚,本质是利用数据库本身的事务机制(redo/undo log)保证多个 SQL 操作要么全部成功要么全部失败。 - Set 判断自定义对象是否一致:Set 底层(如 HashSet)依赖元素的
hashCode()和equals()方法判断是否为重复元素——先比较hashCode()是否相同(快速筛选),哈希值相同时再用equals()精确比较内容,因此自定义类如果要正确存入 Set 并去重,必须同时重写这两个方法且保证逻辑一致(相等的对象哈希值必须相同)。 - JVM 堆内新生代/老年代:堆内存按对象存活周期分为新生代(Young Generation,又分 Eden 区和两个 Survivor 区)和老年代(Old Generation);新对象优先在 Eden 区分配,经过多次 Minor GC 仍存活的对象会晋升到老年代,老年代空间不足时触发 Major GC/Full GC,这种分代设计基于”大部分对象朝生夕死”的经验假设,能提高垃圾回收效率。