本文整理了网友分享的美团AI面试题,仅供参考。
模块 | 面试问题 | 标记 |
---|---|---|
网络 & 操作系统 | TCP 粘包拆包原理及解决方案 | |
网络 & 操作系统 | TCP 三次握手/四次挥手流程及原因 | 高频 |
网络 & 操作系统 | TCP 拥塞控制机制及算法 | 高频 |
网络 & 操作系统 | TCP 超时重传机制的重要性 | |
网络 & 操作系统 | TCP keepalive 是什么,有什么用 | 高频 |
网络 & 操作系统 | UDP 与 TCP 的区别 | |
网络 & 操作系统 | HTTP 与 HTTPS 的区别 | |
网络 & 操作系统 | HTTP 状态码 301 与 302 的区别 | |
网络 & 操作系统 | Linux 如何查看磁盘空间 | |
网络 & 操作系统 | Linux 如何查看/管理进程内存使用 | |
网络 & 操作系统 | Linux 虚拟内存与物理内存的区别 | |
网络 & 操作系统 | Linux 权限系统与修改方法 | 易错 |
网络 & 操作系统 | Linux 文件复制如何保持权限一致 | 易错 |
网络 & 操作系统 | Linux 管道机制和使用示例 | |
网络 & 操作系统 | find 命令的用法 | |
Java 基础与进阶 | ThreadLocal 的作用和应用场景 | 高频、易错 |
Java 基础与进阶 | Java 多态的理解与实现方式 | 高频、易错 |
Java 基础与进阶 | Java 中封装的意义 | |
Java 基础与进阶 | String 是否可继承,为什么 | |
Java 基础与进阶 | final 与 static 的区别和使用 | |
Java 基础与进阶 | finally 中 return 会发生什么 | 高频、易错 |
Java 基础与进阶 | 自动装箱与拆箱的原理及示例 | 高频、易错 |
Java 基础与进阶 | Java 中的内部类解释 | |
Java 基础与进阶 | equals 和 hashCode 的区别及应用 | 易错 |
Java 基础与进阶 | 接口与抽象类的区别 | |
Java 基础与进阶 | 方法重写与重载的区别 | |
Java 基础与进阶 | Spring Boot 自动装配原理 | |
Java 基础与进阶 | Spring 注解、事务、循环依赖等常见问题 | |
Java 基础与进阶 | Java 中线程的创建与使用 | |
数据库 & 缓存 | 数据库索引的建立及好坏判断 | 高频 |
数据库 & 缓存 | SQL explain 的作用和优化 SQL | |
数据库 & 缓存 | 数据库死锁的定义与避免方法 | 高频、易错 |
数据库 & 缓存 | 乐观锁与悲观锁区别 | |
数据库 & 缓存 | 缓存与数据库一致性问题 | 高频、易错 |
数据库 & 缓存 | 缓存穿透、击穿、雪崩的处理策略 | 高频 |
数据库 & 缓存 | Redis 内存淘汰策略 | |
数据库 & 缓存 | Mysql 索引何时生效 | 高频 |
系统设计 | 设计一个排行榜系统,保证公平与高并发一致性 | 高频、易错 |
系统设计 | 设计微博热搜系统(带时间因素) | |
系统设计 | 设计点赞防刷系统(基于 Redis + Sentinel) | |
系统设计 | 设计聊天系统(超时重发、一致性) | 高频、易错 |
系统设计 | 直播平台实时显示前十主播设计(zset/堆) | |
系统设计 | 扫码登录功能的设计与安全考虑 | |
系统设计 | 网站搜索系统设计及内容权重评估 | |
系统设计 | 如何实现一个服务的高并发高可用设计 | |
系统设计 | 设计内容热度系统(浏览/评论/分享) | |
通用能力 & 行为题 | 学习新语言或框架的方式 | |
通用能力 & 行为题 | 学习框架时遇到的经典问题(如 Spring 循环依赖) | |
通用能力 & 行为题 | 解决过的典型项目困难(如人脸识别准确率) | |
通用能力 & 行为题 | 如何评估/提升人脸识别准确率,有无科学依据 | |
通用能力 & 行为题 | 你是如何做 code review 的 | |
通用能力 & 行为题 | 你大学期间是怎么学习技术知识的 | |
通用能力 & 行为题 | 如何持续学习、保持动力 | |
通用能力 & 行为题 | 哪些工具对你帮助很大? | |
通用能力 & 行为题 | 项目中持续优化某个问题的经历 | |
通用能力 & 行为题 | 团队合作中如何高效分工 | |
通用能力 & 行为题 | 未来三年职业规划 | |
通用能力 & 行为题 | 遇到陌生领域问题如何处理 | |
通用能力 & 行为题 | 你在项目中如何处理压力大的情况? | |
通用能力 & 行为题 | 你最近一次复盘学习效果的方法是什么? | |
通用能力 & 行为题 | 数据库中 explain 输出的字段都表示什么,如何解读 | |
通用能力 & 行为题 | 缓存失效策略有哪些,如何选择合适的策略 | 高频 |
数据库 & 缓存 | 你是如何在项目中发现并解决性能瓶颈的? | |
数据库 & 缓存 | 当你在团队中遇到分歧时是怎么处理的? | |
通用能力 & 行为题 | 描述一次你从零搭建系统或组件的经历,包括遇到的挑战和解决办法 | |
通用能力 & 行为题 | 你是如何评估和选择使用的技术栈的?是否有踩过坑 |
网络 & 操作系统
1. TCP 粘包拆包原理及解决方案
问题描述: TCP 是面向字节流的协议,数据之间没有边界。当多个小数据包发送得非常快或一个大数据包被拆分时,接收方可能一次性收到多个数据包(粘包)或不完整的数据(拆包)。
解决方案:
- 固定消息长度:适合消息体长度固定的情况,简单但不够灵活。
- 使用特殊分隔符:如
\n
,但要避免消息体中出现该分隔符。 - 添加长度字段:头部指定消息长度,最常见的方式。
- 使用协议封装:如 Protobuf、Netty 已自带编解码器,简化处理。
2. TCP 三次握手/四次挥手流程及原因
三次握手目的:
- 建立可靠连接,双方确认收发能力。
- 防止历史连接混入。
过程:
- 客户端 SYN;2. 服务器 SYN-ACK;3. 客户端 ACK。
四次挥手目的:
- TCP 是双向通信,需双方各自关闭连接。
过程:
- 客户端 FIN;2. 服务器 ACK;3. 服务器 FIN;4. 客户端 ACK。
3. TCP 拥塞控制机制及算法
目标: 控制数据注入速度,防止网络拥塞。
阶段:
- 慢开始:初始窗口小,每收到 ACK 加倍增长。
- 拥塞避免:达到阈值后线性增长。
- 快速重传:收到 3 次重复 ACK,快速重发丢失段。
- 快速恢复:快速重传后不进入慢开始,直接恢复。
4. TCP 超时重传机制的重要性
意义: 提高可靠性,确保数据不丢失。
原理:
- 每发一个段就启动计时器,未收到 ACK 则重传。
- RTO = SRTT + 4 * RTTVAR,动态变化。
优势: 配合拥塞控制机制使用,能快速适应网络波动。
5. TCP keepalive 是什么,有什么用
定义: 长连接探测机制,用于判断连接是否存活。
工作机制:
- 空闲一段时间后发探测包(默认 2 小时)。
- 若连续 N 次无响应,关闭连接。
作用: 释放死连接,保持连接有效性。
6. UDP 与 TCP 的区别
UDP 无连接、快速、无保障,适合实时传输; TCP 面向连接、可靠、顺序传输,适合文件、事务处理等。
TCP 实现复杂,提供确认、重传、拥塞控制等;UDP 简洁高效,无需建立连接。
7. HTTP 与 HTTPS 的区别
- HTTPS = HTTP + SSL/TLS,加密+身份验证。
- 使用证书(由 CA 签发)保证通信双方身份。
- 更安全但连接建立成本高。
- 一般用于支付、登录等敏感场景。
8. HTTP 状态码 301 与 302 的区别
- 301:永久跳转,客户端/搜索引擎应更新资源地址。
- 302:临时跳转,客户端不应记住新地址。
SEO 优化推荐使用 301,避免权重分散。
9. Linux 如何查看磁盘空间
使用 df -h
查看各挂载点磁盘使用情况,单位友好(如 GB)。
10. Linux 如何查看/管理进程内存使用
top
或htop
实时查看内存情况。- ps查看系统的进程
ps aux --sort=-%mem
按内存占用排序。- 使用
smem
可细化内存分布。
11. 虚拟内存与物理内存的区别
- 物理内存:真实存在的 RAM。
- 虚拟内存:每个进程的独立地址空间,OS 映射到物理内存或磁盘 Swap。
12. Linux 权限系统与修改方法
每个文件有所有者、所属组、其他用户三类权限(rwx)。使用 chmod
修改权限,chown
修改所有者,umask
设置默认权限。
13. Linux 文件复制如何保持权限一致
使用 cp -p
或 rsync -a
复制文件时保留权限、时间等元信息。
14. Linux 管道机制和使用示例
管道 |
用于把一个命令的输出传递给另一个命令,例如:ps aux | grep java
。
15. find 命令的用法
find /path -name '*.log'
查找指定路径下所有 .log 文件;配合 -mtime/-size/-exec
进行高级查找操作。
Java 基础与进阶
16. ThreadLocal 的作用和应用场景
为每个线程提供独立变量副本,适合数据库连接、用户上下文等线程隔离场景。
17. Java 多态的理解与实现方式
父类引用指向子类对象,调用方法根据实际对象类型决定,依赖重写(Override)实现。
18. Java 中封装的意义
将实现细节隐藏,通过方法暴露接口,提高安全性、复用性与维护性。
19. String 是否可继承,为什么
不可继承,String 被 final
修饰,确保不可变性和安全。
20. final 与 static 的区别和使用
final
修饰常量、类、方法,表示不可变或不可重写。static
表示静态成员,属于类而非对象。
21. finally 中 return 会发生什么
finally 中的 return 会覆盖 try/catch 中的 return,应谨慎使用。
22. 自动装箱与拆箱的原理及示例
编译器在基本类型与包装类型之间自动转换,如 Integer a = 1;
是自动装箱。
23. Java 中的内部类解释
分为成员内部类、静态内部类、局部内部类、匿名内部类,常用于事件回调、封装逻辑等场景。
24. equals 和 hashCode 的区别及应用
equals
判断对象内容是否相等。hashCode
用于哈希结构定位元素位置。二者需保持一致性。
25. 接口与抽象类的区别
接口用于规范功能,抽象类用于共享逻辑。接口支持多继承,抽象类只能单继承。
26. 方法重写与重载的区别
- 重写是子类重写父类方法(签名相同)。
- 重载是方法同名但参数不同,编译期决定。
27. Spring Boot 自动装配原理
基于 @EnableAutoConfiguration
和 spring.factories
实现条件 Bean 加载(Conditional 系列注解)。
28. Spring 注解、事务、循环依赖等常见问题
- 注解如
@Component
、@Autowired
。 - 事务失效常见于内部调用。
- 单例构造注入易引发循环依赖,Spring 用三级缓存解决。
29. Java 中线程的创建与使用
使用 Thread
类、Runnable
接口、Callable+Future
,推荐使用线程池 Executors
管理线程。
数据库 & 缓存
30. 数据库索引的建立及好坏判断
合理建索引可大幅提升查询性能。使用 EXPLAIN
判断是否使用索引、索引选择度等。
31. SQL explain 的作用和优化 SQL
分析 SQL 执行计划,发现全表扫描、索引失效等问题,优化方式包括改写 SQL、增加索引等。
32. 数据库死锁的定义与避免方法
多个事务持有资源并请求对方资源形成等待环。避免方法:统一加锁顺序、使用超时机制、细粒度锁等。
33. 乐观锁与悲观锁区别
- 乐观锁:基于版本号,适用于冲突少场景。
- 悲观锁:直接加锁防止并发冲突,适用于写冲突频繁场景。
34. 缓存与数据库一致性问题
常用方案:先更新数据库,再删缓存(或延迟双删);或使用异步消息队列同步。
35. 缓存穿透、击穿、雪崩的处理策略
- 穿透:布隆过滤器、防空缓存。
- 击穿:热点加锁、互斥访问。
- 雪崩:设置过期时间随机化、预热机制、限流降级。
36. Redis 内存淘汰策略
如 LRU、LFU、TTL、随机淘汰等,通过 maxmemory-policy
配置。
37. Mysql 索引何时生效
- WHERE 条件中包含索引列,且无函数、计算、隐式类型转换。
- 避免
%like
模式和 OR 条件导致索引失效。
系统设计
38. 设计一个排行榜系统
使用 Redis ZSet 实现排序与打分;定期异步同步数据库;防止作弊可加限流与验证。
39. 微博热搜系统设计
热度可加时间衰减因子;使用滑动窗口 + ZSet 实现时间加权排序。
40. 点赞防刷系统
用户操作计入缓存,限速 + 黑名单;Redis 记录点赞日志,结合 Sentinel 做限流。
41. 聊天系统设计
基于长连接、WebSocket 实现,可靠性通过 ACK 机制、MQ 存储未读消息、超时重发保证。
42. 实时显示前十主播
使用 Redis ZSet 或小顶堆维护主播热度榜单,定期更新 UI 页面。
43. 扫码登录设计
用户扫码绑定临时 token,通过轮询或 WebSocket 通知前端确认登录,注意 token 超时与一次性使用。
44. 搜索系统设计
构建倒排索引,分词 + 权重(点击率、相关性)计算排序得分,Lucene/Elasticsearch 常用。
45. 服务高并发高可用设计
使用负载均衡、服务注册中心、异步解耦、降级限流、缓存 + MQ,保障性能和可用性。
46. 内容热度系统
综合浏览、点赞、评论等行为,按权重计入 Redis 统计,结合时间衰减和去重机制。
通用能力 & 行为题
47. 学习新语言或框架的方式
阅读官方文档 + 实践 Demo + 看源码 + 写博客总结。
48. 学习框架时遇到的经典问题
Spring 循环依赖、事务失效、注入顺序等;通过日志排查 + Debug 定位。
49. 项目中的典型困难
如模型精度低,通过数据清洗、特征工程、调参、集成等手段优化。
50. 如何评估/提升人脸识别准确率
评估指标如 Precision/Recall/F1;提升方法包括数据增强、模型融合等。
51. 如何做 code review
关注命名规范、逻辑是否清晰、异常处理、性能问题、测试覆盖率。
52. 大学期间如何学习技术
以竞赛/项目为驱动,主动参与开源/博客写作,注重动手能力。
53. 如何持续学习、保持动力
设定目标、阶段复盘、输出内容(博客/演讲)激励自己成长。
54. 对你帮助大的工具
IDEA、VSCode、Postman、Fiddler、Docker、Jupyter、Typora、Git。
55. 项目中持续优化问题
如接口性能慢,优化缓存 + 并发控制 + 减少外部依赖。
56. 团队合作中如何高效分工
角色清晰、接口明确、协作工具辅助(飞书、Git Flow、看板)。
57. 未来三年职业规划
前期深耕技术、提升架构思维,逐步承担更多产品/团队责任。
58. 陌生领域问题如何处理
查阅资料、请教同行、阅读源码、写 Demo,快速验证思路。
59. 项目中如何处理压力大
合理拆解任务、优先级排序、与团队沟通分担、阶段性休息。
60. 最近一次复盘学习的方法
定期回顾项目总结、输出文章、梳理知识点和错题集。
61. explain 输出字段含义
type
表示访问类型(如 index, full scan)rows
预估读取行数key
使用的索引Extra
提示是否使用文件排序等
62. 缓存失效策略有哪些
- 定期清理(定时或惰性)
- 设置过期时间 TTL
- 内存淘汰(LRU、LFU) 选择策略视业务特性和缓存类型决定。
63. 如何发现并解决性能瓶颈
使用 profiler、日志、慢 SQL 分析工具定位,再通过缓存、异步、限流等优化。
64. 团队中遇到分歧如何处理
理性讨论,用数据和实验验证方案,必要时引入第三方意见。
65. 从零搭建系统的经历
按模块设计、接口规范、逐步迭代上线,重视日志监控、测试用例和文档。
66. 如何评估和选择技术栈,是否踩过坑
从社区活跃度、文档完整性、团队熟悉度评估,踩坑需记录总结,写规范避免重复犯错。