这篇文章分享了在美团进行日常实习面试的经历,包含了一些面试问题及其参考答案,旨在帮助大家复习和准备。虽然整体难度不算很高,但对于实习生来说,这些问题已经具备一定挑战性。

面试概况

面试持续了大约45分钟,并且我已经成功获得了Offer!

个人背景

  • 我毕业于211大学,2026届,学习Java已有一年多时间。
  • 我的简历上包含一个修改后的培训项目和一个参与的学校比赛项目,编码能力一般,技术基础处于中等水平。

面试问题

1. 请做自我介绍。

2. 针对项目进行30分钟的深入提问,主要围绕架构设计和功能开发思路。

图片

3. 你在项目中使用了CompletableFuture进行任务编排,请解释具体实现及需要自定义线程池的原因?如果某个任务失败了,你会如何处理异常?

4. Java线程池的参数有哪些?如何合理设置线程数?固定配置有什么问题?什么是动态线程池?

参考代码:

/**  
 * 用给定的初始参数创建一个新的ThreadPoolExecutor。  
 */  
public ThreadPoolExecutor(int corePoolSize, // 线程池的核心线程数量  
                          int maximumPoolSize, // 线程池的最大线程数  
                          long keepAliveTime, // 多余的空闲线程存活的最长时间  
                          TimeUnit unit, // 时间单位  
                          BlockingQueue<Runnable> workQueue, // 用于存储等待执行任务的队列  
                          ThreadFactory threadFactory, // 创建线程的工厂,通常使用默认即可  
                          RejectedExecutionHandler handler // 拒绝策略  
                          ) {  
    // 代码省略 
}  

线程数的设置可以遵循以下通用原则:

  • CPU密集型任务(N+1): 将线程数设置为CPU核心数N再加1,以避免因偶发的任务暂停导致的资源浪费。
  • I/O密集型任务(2N): 由于此类任务在处理I/O时不占用CPU,因此可以设置为2倍的CPU核心数N。

更严谨的计算公式为:最佳线程数 = N * (1 + WT / ST),其中WT为线程等待时间,ST为线程计算时间。

5. 请概述你了解的Java同步机制。

参考答案:

  • synchronized:Java中的关键字,确保同一时刻只有一个线程可以执行修饰的方法或代码块。
  • ReentrantLock:实现了Lock接口的可重入独占锁,提供更多高级功能。
  • ReentrantReadWriteLock:可重入读写锁,保证多线程同时读的效率,并在写操作时保持线程安全。
  • StampedLock:JDK 1.8引入的性能优越的读写锁,具有不可重入性。
  • Semaphore:控制同时访问某一特定资源的线程数量。
  • CountDownLatch:允许计数个线程阻塞,直到所有线程完成任务。

6. 在项目中为什么使用分布式锁?其实现方式是什么?

7. 项目中使用了Redis的哪些数据类型?

8. MySQL如何解决慢查询问题?

# 开启慢查询日志功能  
SET GLOBAL slow_query_log = 'ON';  
# 设置慢查询日志文件存放位置  
SET GLOBAL slow_query_log_file = '/var/lib/mysql/ranking-list-slow.log';  
# 记录无论是否超时的未索引记录  
SET GLOBAL log_queries_not_using_indexes = 'ON';  
# 设置慢查询阈值(秒)  
SET SESSION long_query_time = 1;  
# 仅记录扫描行数大于此参数的SQL  
SET SESSION min_examined_row_limit = 100;  

通过show variables like 'slow%';命令可以查看设置情况。

接下来的步骤涉及通过SQL查询慢查询日志,并使用EXPLAIN命令分析。关于慢查询的详细信息可以参见阿里的一篇文章:慢SQL治理经验总结

9. MySQL的隔离级别是通过锁实现的吗?

MySQL的隔离级别是通过锁和MVCC机制共同实现的。SERIALIZABLE隔离级别使用锁来实现,而READ-COMMITTED和REPEATABLE-READ则是基于MVCC。

10. MySQL的默认隔离级别是什么?是否能解决幻读问题?

MySQL InnoDB存储引擎的默认隔离级别是REPEATABLE-READ。虽然该级别标准上无法防止幻读,但InnoDB通过MVCC和Next-Key Lock机制,实际上能够解决幻读问题。

11. 算法:买卖股票的最佳时机 II

此题为Leetcode原题:122.买卖股票的最佳时机 II