面试公司:美团
面试岗位:Java后端开发工程师
面试形式:电话面试
面试时长:约 50 分钟
面试轮次:第一轮技术面
这场美团 Java 一面属于“广度覆盖+重点深挖”的类型,基础知识问得细致,例如 TCP 的可靠机制、线程私有变量、CAS 弱点等,同时还穿插设计模式、Redis 内核、慢 SQL 优化思路等多方面内容。最后加了一道手撕变式题,整体节奏偏快,面试官追问比较多,建议提前熟悉面试项目中你主动提到的关键词。
考察点:沟通能力、项目整体概况
考察点:网络协议基础
答案:
考察点:协议应用理解
答案:
考察点:协议细节理解
答案:
考察点:网络层协议细节辨析
答案:
考察点:操作系统基础
答案:
考察点:线程隔离技术
答案:
通过 ThreadLocal
实现线程内变量隔离,不同线程访问的是独立副本。
考察点:源码理解、JVM 内存管理
答案:
ThreadLocalMap
,Key 是弱引用remove()
,会导致 Value 无法被回收,从而内存泄漏答案:
remove()
方法考察点:JVM 同步机制
答案:
依赖对象头的 Monitor,底层依赖 JVM 的 monitorenter/monitorexit
指令。加锁过程可能涉及偏向锁、轻量级锁和重量级锁的升级过程。
答案:
考察点:无锁编程思想
答案:
AtomicStampedReference
解决 ABA 问题考察点:线程池执行流程
答案:
线程池执行步骤大致如下:
答案:
答案:
为了最大化利用 CPU,不让线程过多导致上下文切换,也不浪费资源。
考察点:索引使用原则
答案:
考察点:数据库调优实操
答案:
EXPLAIN
)考察点:MySQL 查询优化细节
答案:
从 MySQL 5.6 开始,支持将查询条件下推至存储引擎层进行过滤,减少回表,提高查询效率。
答案:
ZSet(有序集合)底层由 跳表 + Hash 表 组成:跳表负责排序结构,Hash 表提供快速定位。
考察点:高级数据结构
答案:
跳表通过多层链表提高查找效率,时间复杂度 O(log n),空间复杂度 O(n),比红黑树实现简单,适合有序结构需求场景。
答案:
答案:
答案:
答案:
epoll
(Linux)实现事件驱动机制处理并发连接考察点:项目深度、技术选型、问题解决思路
建议: 突出业务目标、性能优化、分布式处理等关键词,便于面试官引申提问。
考察点:链表操作、边界处理
原题:两数相加(https://leetcode.cn/problems/add-two-numbers/)
面试中变为了“链表减法”,逻辑类似但需要处理借位问题
// 假设两个链表 l1、l2 表示两个正整数,返回 l1 - l2 的结果,数字倒序存储
public ListNode subtractTwoNumbers(ListNode l1, ListNode l2) {
ListNode dummy = new ListNode(0), curr = dummy;
int borrow = 0;
while (l1 != null || l2 != null) {
int x = l1 != null ? l1.val : 0;
int y = l2 != null ? l2.val : 0;
int diff = x - y - borrow;
if (diff < 0) {
diff += 10;
borrow = 1;
} else {
borrow = 0;
}
curr.next = new ListNode(diff);
curr = curr.next;
if (l1 != null) l1 = l1.next;
if (l2 != null) l2 = l2.next;
}
return dummy.next;
}
这场美团一面涵盖了以下重点模块:
模块 | 关键词 |
---|---|
网络 | TCP、UDP、IO 多路复用、可靠机制 |
并发 | ThreadLocal、synchronized、CAS、线程池执行流程 |
数据库 | 索引优化、慢 SQL、索引下推 |
Redis | 跳表、ZSet、过期删除、多路复用 |
设计模式 | 观察者模式、策略模式(未展开但建议准备) |
手撕代码 | 链表处理能力,变式适应能力 |
建议在准备社招时,深入掌握项目中的关键技术点,并根据关键词延伸到基础原理,这样更容易应对面试官的追问。
如果你也在准备 Java 后端岗位,可以关注我、留言交流,我会持续整理大厂面经、高频八股与项目拆解,陪你一起稳稳上岸!