美团Java后端日常实习二面面经
- 轮次
- 二面
- 时间
- 2026-09
- 来源
- 牛客网
《面试题目》
- TCP 和 UDP 有什么区别?
- TCP 建立连接为什么需要三次握手,每次握手分别做了什么?
- TCP 断开连接时四次挥手的过程是什么?
- Java 中有哪些常见的集合?
- 向 ArrayList 中添加一个元素的过程是什么?
- ArrayList 和 LinkedList 有什么区别,各自适用于哪些场景?
- 介绍一下 HashMap:发生哈希冲突时为什么采用尾插法?链表过长如何处理?多线程操作时如何保证线程安全?
- volatile 能否保证线程安全?
- Java 中锁升级的过程是什么?
- 线程池有哪些核心参数?
- ThreadLocal 是否线程安全,如何保证?
- MySQL 有哪些事务隔离级别?各自解决什么问题?可重复读在哪些情况下不能解决幻读?
- MySQL 的主键索引、唯一索引和普通索引有什么区别?查询效率有什么不同?
- MySQL 的索引结构为什么选择 B+ 树?
- Redis 有哪些常见数据类型,分别适用于什么场景?
- 如何处理 Redis 与数据库之间的数据不一致?两边操作不属于同一事务时如何处理?
- 如何排查慢 SQL?查看 EXPLAIN 执行计划时重点关注哪些指标?
- 哪些情况下已经建立索引的字段仍会索引失效?
- 什么是单例?如何验证多次获取的是同一个实例?还有哪些实现方式?
- synchronized 如何保证线程安全?它与 ReentrantLock 有什么区别?
- 如何用 Java 编写三个线程按 abc 顺序交替输出 10 组?
- 如何用 Java 手写一个线程安全的单例类?
《参考解析》
- TCP 与 UDP:TCP 面向连接、可靠、有序并提供流量和拥塞控制;UDP 无连接、开销小、只提供尽力而为的数据报传输。
- 三次握手与四次挥手:三次握手分别同步双方初始序列号并确认双向收发能力;挥手需要分别关闭两个方向的数据通道,通常由四个报文完成。
- 集合与 ArrayList:ArrayList 基于连续数组,尾部追加均摊 O(1),扩容时复制数组;LinkedList 基于链表,按节点插入删除方便但随机访问慢。
- HashMap 与并发:哈希冲突在桶内以链表或树组织,尾插可保持遍历顺序并避免头插在并发扩容时形成环。多线程场景应使用 ConcurrentHashMap 或外部同步,不能直接依赖 HashMap。
- volatile 与锁升级:volatile 保证可见性和有序性,不保证复合操作的原子性;锁会根据竞争从偏向/轻量级逐步膨胀到重量级(具体版本实现可能不同)。
- 线程池参数:核心线程数、最大线程数、空闲存活时间、时间单位、工作队列、线程工厂和拒绝策略共同决定吞吐、延迟与过载行为,应结合任务类型和容量评估。
- ThreadLocal:每个线程维护独立的 ThreadLocalMap,通常不会产生共享数据竞争;线程池中使用后应在 finally 里 remove,避免 value 长期残留。
- MySQL 事务与索引:隔离级别从读未提交到串行化逐步提高隔离性;可重复读依赖 MVCC,但当前读、范围锁缺失等场景仍可能出现幻读。B+ 树多路、矮胖且叶子有序链表,适合磁盘范围查询。
- Redis 一致性:常见做法是先提交数据库再删除缓存,并配合重试、消息订阅或延时双删。库存、余额等强一致数据应以数据库事务和版本校验为准。
- 慢 SQL 与索引失效:通过慢查询日志和 EXPLAIN 查看扫描行数、访问类型、候选/实际索引等;对索引列做函数或隐式类型转换、前缀模糊匹配、违反联合索引最左匹配等都可能导致失效。
- 单例与算法:单例可用枚举或静态内部类实现,验证时比较对象引用;三个线程可用
Condition/Semaphore按状态轮转,链表反转用迭代指针,判断环用快慢指针。