面灵AI→

空窗三年后的第一场面试:外包 Java 岗问了这些基础题

轮次
一面
时间
2026-10
来源
牛客网

《面试题目》

  1. ArrayList、LinkedList、Set 有什么区别?
  2. 深拷贝和浅拷贝的区别和使用场景?
  3. 反射是什么,有什么用?
  4. MySQL 的 ACID 和隔离级别?
  5. Redis 的缓存击穿、穿透、雪崩分别是什么?
  6. 你还有什么想问的?

《参考解析》

集合三件套按「底层结构 + 随机访问 + 增删 + 有序性」对比。ArrayList 是动态数组,随机访问 O(1)、中间插入删除要搬元素;LinkedList 是双向链表,头尾增删 O(1)、随机访问 O(n),实际项目里ArrayList 更常用,LinkedList 还多了内存开销;Set 保证元素不重复,HashSet 基于哈希表无序,LinkedHashSet 保留插入顺序,TreeSet 基于红黑树有序、操作 O(log n)。

浅拷贝只复制引用,深拷贝递归复制对象。浅拷贝后两个对象共享同一份内部引用,改一个会影响另一个;深拷贝要重写 clone、序列化或用手写构造。使用场景:不可变对象或内部成员都是基本类型时浅拷贝够用;对象图里含可变引用、需要独立生命周期时必须深拷贝。

反射是运行时获取类信息并操作对象的能力。Class.forName 拿到 Class,再取构造器、方法、字段并调用,Spring 的依赖注入、MyBatis 的映射、注解扫描都靠它。代价是性能开销和封装破坏,热点路径要缓存 Method 或改用 MethodHandle。

ACID 是原子性、一致性、隔离性、持久性;InnoDB 默认 RR,靠 MVCC 实现快照读,靠间隙锁/临键锁处理当前读的幻读。四个隔离级别从低到高是读未提交、读已提交、可重复读、串行化。

缓存三兄弟的区别在「数据存不存在」:穿透是查一个数据库里根本不存在的 key,请求全打到库里,用布隆过滤器或空值缓存;击穿是某个热点 key 过期瞬间大量请求回源,用互斥锁或逻辑过期;雪崩是大量 key 同时过期或缓存整体不可用,用过期时间加随机抖动、多级缓存和熔断降级。