面灵AI

美团Java后端日常实习二面面经

轮次
二面
时间
2026-09
来源
牛客网

《面试题目》

  1. TCP 和 UDP 有什么区别?
  2. TCP 建立连接为什么需要三次握手,每次握手分别做了什么?
  3. TCP 断开连接时四次挥手的过程是什么?
  4. Java 中有哪些常见的集合?
  5. 向 ArrayList 中添加一个元素的过程是什么?
  6. ArrayList 和 LinkedList 有什么区别,各自适用于哪些场景?
  7. 介绍一下 HashMap:发生哈希冲突时为什么采用尾插法?链表过长如何处理?多线程操作时如何保证线程安全?
  8. volatile 能否保证线程安全?
  9. Java 中锁升级的过程是什么?
  10. 线程池有哪些核心参数?
  11. ThreadLocal 是否线程安全,如何保证?
  12. MySQL 有哪些事务隔离级别?各自解决什么问题?可重复读在哪些情况下不能解决幻读?
  13. MySQL 的主键索引、唯一索引和普通索引有什么区别?查询效率有什么不同?
  14. MySQL 的索引结构为什么选择 B+ 树?
  15. Redis 有哪些常见数据类型,分别适用于什么场景?
  16. 如何处理 Redis 与数据库之间的数据不一致?两边操作不属于同一事务时如何处理?
  17. 如何排查慢 SQL?查看 EXPLAIN 执行计划时重点关注哪些指标?
  18. 哪些情况下已经建立索引的字段仍会索引失效?
  19. 什么是单例?如何验证多次获取的是同一个实例?还有哪些实现方式?
  20. synchronized 如何保证线程安全?它与 ReentrantLock 有什么区别?
  21. 如何用 Java 编写三个线程按 abc 顺序交替输出 10 组?
  22. 如何用 Java 手写一个线程安全的单例类?

《参考解析》

  1. TCP 与 UDP:TCP 面向连接、可靠、有序并提供流量和拥塞控制;UDP 无连接、开销小、只提供尽力而为的数据报传输。
  2. 三次握手与四次挥手:三次握手分别同步双方初始序列号并确认双向收发能力;挥手需要分别关闭两个方向的数据通道,通常由四个报文完成。
  3. 集合与 ArrayList:ArrayList 基于连续数组,尾部追加均摊 O(1),扩容时复制数组;LinkedList 基于链表,按节点插入删除方便但随机访问慢。
  4. HashMap 与并发:哈希冲突在桶内以链表或树组织,尾插可保持遍历顺序并避免头插在并发扩容时形成环。多线程场景应使用 ConcurrentHashMap 或外部同步,不能直接依赖 HashMap。
  5. volatile 与锁升级:volatile 保证可见性和有序性,不保证复合操作的原子性;锁会根据竞争从偏向/轻量级逐步膨胀到重量级(具体版本实现可能不同)。
  6. 线程池参数:核心线程数、最大线程数、空闲存活时间、时间单位、工作队列、线程工厂和拒绝策略共同决定吞吐、延迟与过载行为,应结合任务类型和容量评估。
  7. ThreadLocal:每个线程维护独立的 ThreadLocalMap,通常不会产生共享数据竞争;线程池中使用后应在 finally 里 remove,避免 value 长期残留。
  8. MySQL 事务与索引:隔离级别从读未提交到串行化逐步提高隔离性;可重复读依赖 MVCC,但当前读、范围锁缺失等场景仍可能出现幻读。B+ 树多路、矮胖且叶子有序链表,适合磁盘范围查询。
  9. Redis 一致性:常见做法是先提交数据库再删除缓存,并配合重试、消息订阅或延时双删。库存、余额等强一致数据应以数据库事务和版本校验为准。
  10. 慢 SQL 与索引失效:通过慢查询日志和 EXPLAIN 查看扫描行数、访问类型、候选/实际索引等;对索引列做函数或隐式类型转换、前缀模糊匹配、违反联合索引最左匹配等都可能导致失效。
  11. 单例与算法:单例可用枚举或静态内部类实现,验证时比较对象引用;三个线程可用 Condition/Semaphore 按状态轮转,链表反转用迭代指针,判断环用快慢指针。