【美团】Java后端一面复盘|网络+线程+MySQL+Redis+设计模式+手撕算法

📍 面试公司:美团
🎯 面试岗位:Java后端开发工程师
📞 面试形式:电话面试
🕒 面试时长:约 50 分钟
🔁 面试轮次:第一轮技术面


✨ 面试整体节奏:

这场美团 Java 一面属于“广度覆盖+重点深挖”的类型,基础知识问得细致,例如 TCP 的可靠机制、线程私有变量、CAS 弱点等,同时还穿插设计模式、Redis 内核、慢 SQL 优化思路等多方面内容。最后加了一道手撕变式题,整体节奏偏快,面试官追问比较多,建议提前熟悉面试项目中你主动提到的关键词。


✅ 面试题目逐题整理与解析:

1. 请做一个简短的自我介绍

考察点:沟通能力、项目整体概况


2. TCP 和 UDP 有什么区别?

考察点:网络协议基础
答案:

  • TCP 面向连接,可靠,顺序,基于字节流
  • UDP 无连接,不保证可靠性、顺序,基于报文

3. TCP 和 UDP 分别适用于哪些场景?

考察点:协议应用理解
答案:

  • TCP:文件传输、HTTP 请求、数据库连接等要求可靠性的场景
  • UDP:视频直播、DNS、语音通话等对速度要求高但可容忍部分丢包的场景

4. TCP 如何实现可靠性?

考察点:协议细节理解
答案:

  • 三次握手、四次挥手
  • 滑动窗口
  • ACK 确认机制
  • 超时重传
  • 校验和
  • 流量控制(基于窗口)
  • 拥塞控制(慢启动、拥塞避免、快重传、快恢复)

5. 流量控制 vs 拥塞控制的区别?

考察点:网络层协议细节辨析
答案:

  • 流量控制:防止接收方来不及处理(接收方能力)
  • 拥塞控制:防止网络过载(网络本身能力)

6. 进程和线程的区别是什么?

考察点:操作系统基础
答案:

  • 进程:资源分配单位,拥有独立地址空间
  • 线程:调度单位,同一进程下线程共享资源,切换开销小

7. 线程如何维护私有变量?

考察点:线程隔离技术
答案:
通过 ThreadLocal 实现线程内变量隔离,不同线程访问的是独立副本。


8. ThreadLocal 的底层原理是什么?会不会造成内存泄漏?

考察点:源码理解、JVM 内存管理
答案:

  • 每个线程维护一个 ThreadLocalMap,Key 是弱引用
  • 如果不手动调用 remove(),会导致 Value 无法被回收,从而内存泄漏

9. 如何避免 ThreadLocal 的内存泄漏?

答案:

  • 每次使用后及时调用 remove() 方法
  • 尽量使用自动清理机制(如在 try-finally 中清除)

10. synchronized 的底层原理是什么?

考察点:JVM 同步机制
答案:
依赖对象头的 Monitor,底层依赖 JVM 的 monitorenter/monitorexit 指令。加锁过程可能涉及偏向锁、轻量级锁和重量级锁的升级过程。


11. synchronized 有哪些锁优化手段?

答案:

  • 偏向锁
  • 轻量级锁
  • 自旋锁
  • 锁粗化、锁消除等编译期优化

12. CAS 是什么?它有哪些缺点?

考察点:无锁编程思想
答案:

  • Compare-And-Swap,用于原子操作
  • 缺点包括:ABA 问题、只能一个变量、循环开销大
  • 可通过版本号、AtomicStampedReference 解决 ABA 问题

13. 提交任务到线程池后是怎么执行的?

考察点:线程池执行流程
答案:
线程池执行步骤大致如下:

  1. 判断核心线程是否已满
  2. 如果未满则新建线程执行任务
  3. 如果满了就入队等待
  4. 队列满则判断是否可以创建非核心线程
  5. 若不能则执行拒绝策略

14. 核心线程数、最大线程数怎么设置?

答案:

  • CPU 密集型:核心线程数 = 核心数 + 1
  • IO 密集型:核心线程数 = 核心数 / (1 - 阻塞系数) ≈ 核心数 * 2 ~ 5

15. 为什么设置线程池核心线程数要考虑 CPU 核心数?

答案:
为了最大化利用 CPU,不让线程过多导致上下文切换,也不浪费资源。


16. 哪些字段不适合建索引?

考察点:索引使用原则
答案:

  • 频繁更新的字段
  • 重复率高的字段(如性别)
  • 长文本字段(如 text、blob)
  • 不参与查询条件的字段

17. 如何优化慢 SQL?

考察点:数据库调优实操
答案:

  • 使用合适索引
  • 避免 select *
  • 使用覆盖索引
  • 减少 join 数量
  • 查看执行计划(EXPLAIN

18. 什么是索引下推?

考察点:MySQL 查询优化细节
答案:
从 MySQL 5.6 开始,支持将查询条件下推至存储引擎层进行过滤,减少回表,提高查询效率。


19. Redis 的 ZSet 是怎么实现的?

答案:
ZSet(有序集合)底层由 跳表 + Hash 表 组成:跳表负责排序结构,Hash 表提供快速定位。


20. 什么是跳表?

考察点:高级数据结构
答案:
跳表通过多层链表提高查找效率,时间复杂度 O(log n),空间复杂度 O(n),比红黑树实现简单,适合有序结构需求场景。


21. Redis 的过期删除策略有哪些?

答案:

  • 定期删除(定时扫描)
  • 惰性删除(访问时发现已过期)
  • 内存淘汰策略(如 LRU、LFU)

22. Redis 为何这么快?

答案:

  • 基于内存存储
  • 单线程模型避免锁竞争
  • 高效的数据结构
  • 多路复用 IO

23. Redis 是单线程的,为什么还能高性能?

答案:

  • 只在主线程处理请求,避免加锁开销
  • IO 多路复用处理高并发
  • 大部分操作是 O(1),延迟低

24. 什么是 IO 多路复用?Redis 怎么用的?

答案:

  • 一种让单线程监听多个 socket 的技术(select、epoll)
  • Redis 使用 epoll(Linux)实现事件驱动机制处理并发连接

25. 项目相关内容介绍

考察点:项目深度、技术选型、问题解决思路
建议: 突出业务目标、性能优化、分布式处理等关键词,便于面试官引申提问。


26. 手撕算法:LeetCode 第 2 题变式(链表加法变减法)

考察点:链表操作、边界处理

原题:两数相加(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 后端岗位,可以关注我、留言交流,我会持续整理大厂面经、高频八股与项目拆解,陪你一起稳稳上岸!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/905722.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Go语言八股文之Mysql锁详解

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 非常期待和您一起在这个小…

实战案例:采集 51job 企业招聘信息

本文将带你从零开始&#xff0c;借助 Feapder 快速搭建一个企业级招聘信息数据管道。在“基础概念”部分&#xff0c;我们先了解什么是数据管道和 Feapder&#xff1b;“生动比喻”用日常场景帮助你快速理解爬虫组件&#xff1b;“技术场景”介绍本项目中如何使用代理等采集策略…

GMT之Bash语言使用

GMT的操作有自己的逻辑和“命令”&#xff0c;但GMT是可以用Bash语言控制的&#xff0c;所以常常以.sh为后缀写GMT程序。 GMT程序运行步骤如下&#xff1a; 采用cd &#xff0c;定位到指定文件夹&#xff1b;以sh ***.sh运行GMT&#xff0c;得到结果。 另外&#xff0c;遇到…

整合Redis

整合Redis 引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId> </dependency> <dependency><groupId>org.apache.commons</groupId><art…

Vue3——Watch侦听器

目录 手动指定监听对象 侦听ref对象 侦听ref对象中的某个属性 reactive写法 watchEffect 自动侦听 多源侦听 一次性侦听器 watch 是⼀个⽤于观察和响应Vue响应式系统中数据变化的⽅法。它允许你指定⼀个数据源&#xff08;可以是 响应式引⽤、计算属性、组件的属性等&#xf…

1、数据结构与算法(Python版-啃书)-绪论

1.1 计算机问题求解 一般而言&#xff0c;人们需要的不是解决一个具体问题的程序&#xff0c;而是解决一类问题的程序。 对于求平方根这样的简单问题&#xff0c;人们希望的也不是专用于求某个数(例如2)的平方根的函数&#xff0c;而是能求任何数的平方根的函数。 用计算机解…

微信小程序之将轮播图设计为组件

在components文件夹上点右键&#xff0c;新建component&#xff0c;命名为swiper 然后将我们之前的代码都拷贝到对应文件中&#xff0c; 然后我们的页面要引用这个组件&#xff0c; 在pages\index\index.json中引入&#xff1a; { "usingComponents": {"van…

【视频】解决FFmpeg将RTSP转RTMP流时,出现的卡死、出错等问题

【视频】郭老二博文之:图像视频汇总 1、简述 如果不修改图像内容,可以使用FFmpeg命令来将RTSP转RTMP流。 SRS视频服务器就是这么干的,它没有使用FFmpeg接口,而是直接使用FFmpeg命令来转流。 但是在使用中,约到了一些问题,比如转流时卡死、转流出错等等,下面描述怎么解…

报销单业务笔记

文章目录 业务点业务点-对公对私业务点-多系统标志 特殊业务入参入参报文 出参出参报文中间的逻辑多对多关系 其他应该是整体成功还是可以部分成功这种多对多关多关系有没有优雅的判断方式 报销单是个通用场景&#xff0c;有通用逻辑&#xff0c;在此基础上进行适度定制&#x…

25软考【软件评测师】:10天极限冲刺攻略(附知识点解析+冲刺攻略)

距离2025上半年“软件评测师”考试已经只剩最后一周多了&#xff0c;还没有准备好的小伙伴赶紧行动起来。为了帮助大家更好的冲刺学习&#xff0c;特此提供一份考前冲刺攻略。本指南包括考情分析、冲刺攻略两个部分&#xff0c;可以参考此指南进行最后的复习要领&#xff0c;相…

python 的 ​uv、pip​ 和 ​conda​ 对比和技术选型

你好&#xff0c;我是 shengjk1&#xff0c;多年大厂经验&#xff0c;努力构建 通俗易懂的、好玩的编程语言教程。 欢迎关注&#xff01;你会有如下收益&#xff1a; 了解大厂经验拥有和大厂相匹配的技术等 希望看什么&#xff0c;评论或者私信告诉我&#xff01; 文章目录 一…

Python logging模块使用指南

Python 的 logging 模块是一个灵活且强大的日志记录工具&#xff0c;广泛应用于应用程序的调试、运行监控和问题排查。它提供了丰富的功能&#xff0c;包括多级日志记录、多种输出方式、灵活的格式配置等。以下是详细介绍&#xff1a; 一、为什么使用 logging 模块&#xff1f;…

开发技术.前端开发相关问题

第一部分 响应式布局 1. 几个布局单位概念 PX: px像素&#xff08;Pixel&#xff09; 相对长度单位。像素px是相对于显示器屏幕分辨率而言的。 PX特点 1. IE无法调整那些使用px作为单位的字体大小&#xff1b; 2. 国外的大部分网站能够调整的原因在于其使用了em或rem作为字体…

1. Go 语言环境安装

&#x1f451; 博主简介&#xff1a;高级开发工程师 &#x1f463; 出没地点&#xff1a;北京 &#x1f48a; 人生目标&#xff1a;自由 ——————————————————————————————————————————— 版权声明&#xff1a;本文为原创文章&#xf…

WPF自定义控件开发全指南:多内容切换与动画集成

WPF自定义控件开发全指南&#xff1a;多内容切换与动画集成 一、控件基础架构设计1.1 选择控件基类1.2 定义关键属性 二、动画系统集成2.1 淡入淡出动画实现2.2 滑动动画实现 三、视觉状态管理四、完整使用示例4.1 XAML声明4.2 动画触发逻辑 五、扩展与优化5.1 性能优化建议5.2…

数据结构 -- 顺序查找和折半查找

查找的基本概念 基本概念 查找&#xff1a;在数据集合中寻找满足某种条件的数据元素的过程 查找表&#xff08;查找结构&#xff09;&#xff1a;用于查找的数据集合称为查找表&#xff0c;它由同一类型的数据结构元素&#xff08;或记录&#xff09;组成 关键字&#xff1…

汽车功能安全--TC3xx MBIST设计要点

英飞凌针对硬件故障的自测&#xff0c;提供了四种机制&#xff1a;PBIST、LBIST、MONBIST和MBIST。 LBIST和MONBIST我们已经聊过了&#xff0c;今天就快速介绍下MBIST。 MBIST&#xff0c;全程Memory Built-in Self Test&#xff0c;用于检测SRAM数据单元的完整性。 在26262…

openpi 入门教程

系列文章目录 目录 系列文章目录 前言 一、运行要求 二、安装 三、模型检查点 3.1 基础模型 3.2 微调模型 四、运行预训练模型的推理 五、在自己的数据上微调基础模型 5.1. 将数据转换为 LeRobot 数据集 5.3. 启动策略服务器并运行推理 5.4 更多示例 六、故障排除…

java加强 -Collection集合

集合是一种容器&#xff0c;类似于数组&#xff0c;但集合的大小可变&#xff0c;开发中也非常常用。Collection代表单列集合&#xff0c;每个元素&#xff08;数据&#xff09;只包含1个值。Collection集合分为两类&#xff0c;List集合与set集合。 特点 List系列集合&#…

深入理解ThingsBoard的Actor模型

1、ThingsBoard系统中定义了哪些Actor ✅ ThingsBoard Actor 创建机制与作用对照表: Actor 类型 何时创建 由谁创建 是否缓存 作用描述 SystemActor 系统启动时 DefaultActorService / ActorSystem ✅ 是 ★ ThingsBoard 平台服务级别管理器:负责创建所有的Actor AppActor