松鼠 AI 25 Java 开发 一面
松鼠 AI 25 Java 开发 一面
本文作者:程序员小白条
1)自我介绍
2)接口调用平台需求分析、业务流程介绍
3)邀请码设计
4)Map、List、Set 区别
5)中奖名单用什么结构,统计人昵称和名次以及频率
6)HashTable 和 HashMap 的区别
7)JVM 垃圾回收,对象死亡判断、垃圾回收算法、垃圾回收器
8)进程和线程的区别
9)线程池的作用
10)内存泄漏的场景和解决方案
11)OSI 七层模型
12)TCP 和 UDP 的区别
13)TCP 可靠性怎么保证的?
14)数据库深度分页优化
15)联合索引场景和注意事项
16)算法:中序遍历 + 合并两个有序数组
反问:技术栈和业务,模块划分等。
2)接口调用平台需求分析、业务流程介绍
需求分析:
- 目标:统一管理外部接口调用,保障安全性和可观测性。
- 功能:
- 权限控制:API密钥+IP白名单。
- 限流熔断:防止滥用(如令牌桶算法)。
- 监控报警:记录调用日志+失败告警。
业务流程:
- 用户申请API密钥并配置权限。
- 调用时携带密钥,网关校验权限和限流。
- 请求转发至后端服务,结果返回并记录日志。
3)邀请码设计
- 生成规则:
- 前缀(标识业务)+ 时间戳 + 随机码(如UUID部分字符)。
- 示例:
INV_20230801_3xY7
。
- 存储:Redis(过期时间)+ MySQL(持久化)。
- 校验:Redis查重+业务规则(如用户绑定防刷)。
4)Map、List、Set 区别
特性 | Map | List | Set |
---|---|---|---|
存储 | Key-Value对 | 有序可重复元素 | 无序唯一元素 |
实现类 | HashMap, TreeMap | ArrayList, LinkedList | HashSet, TreeSet |
用途 | 快速查找(O(1)) | 顺序访问/插入 | 去重/集合运算 |
5)中奖名单结构设计
-
需求:统计昵称、名次、中奖频率。
-
数据结构:
java
// 使用Map嵌套List Map<String, List<Record>> // Record包含:rank(名次)、frequency(频率)
-
Redis实现:
- ZSet(Sorted Set):存储昵称和分数(名次)。
- Hash:记录昵称和频率(
HINCRBY user:frequency 昵称 1
)。
6)HashTable 和 HashMap 的区别
对比项 | HashTable | HashMap |
---|---|---|
线程安全 | 同步方法(性能低) | 非同步(需手动加锁) |
Null键值 | 不允许 | 允许 |
迭代器 | Enumeration(老式) | Iterator + fail-fast |
继承 | Dictionary类 | AbstractMap类 |
7)JVM 垃圾回收
- 对象死亡判断:可达性分析(GC Roots不可达)。
- 算法:
- 标记-清除(碎片问题)
- 复制算法(新生代,Eden→Survivor)
- 标记-整理(老年代)
- 回收器:
- Serial:单线程,适合客户端。
- Parallel Scavenge:吞吐优先。
- CMS:低延迟(已淘汰)。
- G1/ZGC:混合分区,高吞吐低延迟。
8)进程和线程的区别
维度 | 进程 | 线程 |
---|---|---|
资源 | 独立内存空间 | 共享进程资源 |
切换开销 | 高(上下文切换) | 低 |
安全性 | 隔离性好 | 需同步(如锁) |
通信 | IPC(管道、Socket) | 共享内存/变量 |
9)线程池的作用
- 核心价值:
- 降低开销:复用线程,避免频繁创建/销毁。
- 控制并发:通过队列和最大线程数防止资源耗尽。
- 管理任务:支持定时/延迟任务(如
ScheduledThreadPool
)。
10)内存泄漏的场景和解决方案
- 场景:
- 静态集合:如
static Map
未清理。 - 未关闭资源:数据库连接、文件流。
- 监听器未注销:EventBus未解绑。
- 静态集合:如
- 解决:
- 使用弱引用(
WeakHashMap
)。 - try-with-resources自动关闭。
- 工具分析(MAT查找GC Roots)。
- 使用弱引用(
11)OSI 七层模型
层 | 功能 | 协议/设备 |
---|---|---|
应用层 | HTTP/FTP/SMTP | 浏览器 |
表示层 | 数据加密/压缩 | SSL/TLS |
会话层 | 建立/管理会话 | NetBIOS |
传输层 | 端到端通信(TCP/UDP) | 防火墙 |
网络层 | 路由寻址(IP) | 路由器 |
数据链路层 | 帧传输(MAC) | 交换机 |
物理层 | 比特流传输 | 网线/光纤 |
12)TCP 和 UDP 的区别
特性 | TCP | UDP |
---|---|---|
连接 | 面向连接(三次握手) | 无连接 |
可靠性 | 可靠(重传、排序) | 可能丢包 |
效率 | 低(头部大、延迟高) | 高(头部小) |
场景 | 文件传输、Web | 视频会议、DNS |
13)TCP 可靠性保证
- 确认应答(ACK):接收方确认收到数据。
- 超时重传:未收到ACK时重发。
- 流量控制:滑动窗口调整发送速率。
- 拥塞控制:慢启动+拥塞避免。
14)数据库深度分页优化
- 问题:
LIMIT 100000, 10
扫描大量无效数据。 - 优化:
- 子查询:
WHERE id > (SELECT id FROM table LIMIT 100000, 1) LIMIT 10
。 - 游标分页:记录上次查询的ID(如
WHERE id > last_id ORDER BY id LIMIT 10
)。
- 子查询:
15)联合索引场景和注意事项
- 场景:多条件查询(如
WHERE a=1 AND b=2
)。 - 注意事项:
- 最左前缀:索引
(a,b)
无法优化WHERE b=2
。 - 字段顺序:高区分度字段放前面。
- 覆盖索引:避免回表(如
SELECT a,b FROM table
)。
- 最左前缀:索引
松鼠 AI 牛友发过相关的暴雷帖子,我就不重复了。
程序员小白条的编程日记:https://xbt.xiaobaitiao.top/ (分享如何拿到腾讯实习 Offer 和多个中大厂的面试机会,大学经历、求职经历、职场工作、创作经历、生活日常、面经、技术分享)定期更新内容,成长打怪系列,分享从大一到大四的完整面经,看完可冲中大厂!dy同名程序员小白条,主要口述面试经历和分享我认为的实用网站,会比面经讲的详细很多,以真实面试录音为主!公粽号:程序员落叶
#面试问题记录#