⭐️美团面试,拷打了两个多小时
这是一位西南大学 25 届读者的美团面经,目前已经 OC。
面试情况
- 岗位:Java 开发
- 部门:美团到家
整体面试体验非常 Nice,面 试官很有亲和力,很耐心的解答我不清楚的问题,对美团好感 + n!!!
9.4 一面 9.9 二面 ,9.12 HR 面,已 OC。
一面和二面一共拷打的两个多小时。
运气真的是爆棚了!说实话,我并不是觉得自己的技术有多强,真没想到能在差不多一周的时间内“速通”美团。每一轮面试结束时,我都觉得自己可能没戏了,但没过多久又收到了下一轮的邀请。甚至到现在,我仍然觉得,这个 offer 除了运气,真的没有更合理的解释。
这里分享一下一二面比较典型的问题,一面更多的是考察基础,二面主要问实习和项目,八股问相对较少,但也会涉及一点。
问的问题非常多,这里仅对面试中涉及到的最重要问的题进行总结(详细答案由 Guide 补充)。
我主要总结的是 Java 基础、MySQL 、Redis 和场景题,这些是我认为最重要的部分,问的问题都比较典型。JVM、操作系统、计算机网络等知识点也有问,但问的较少,由于篇幅问题这里就省略了。
Java 基础
final, finalize, finally 之间的区别
final
用于声明常量、不可重写的方法和不可继承的类。finalize()
是Object
类的一个方法,用于在对象被垃圾回收之前执行清理工作,但它已被标记为过时,不建议使用。finally
用于定义无论是否发生异常都会执行的代码块,通常用于释放资源。
一个任务需要依赖另外两个任务执行完之后再执行,怎么设计?
这种任务编排场景非常适合通过CompletableFuture
实现。这里假设要实现 T3 在 T2 和 T1 执行完后执行。
代码如下(这里为了简化代码,用到了 Hutool 的线程工具类 ThreadUtil
和日期时间工具类 DateUtil
):
// T1
CompletableFuture<Void> futureT1 = CompletableFuture.runAsync(() -> {
System.out.println("T1 is executing. Current time:" + DateUtil.now());
// 模拟耗时操作
ThreadUtil.sleep(1000);
});
// T2
CompletableFuture<Void> futureT2 = CompletableFuture.runAsync(() -> {
System.out.println("T2 is executing. Current time:" + DateUtil.now());
ThreadUtil.sleep(1000);
});
// 使用allOf()方法合并T1和T2的CompletableFuture,等待它们都完成
CompletableFuture<Void> bothCompleted = CompletableFuture.allOf(futureT1, futureT2);
// 当T1和T2都完成后,执行T3
bothCompleted.thenRunAsync(() -> System.out.println("T3 is executing after T1 and T2 have completed.Current time:" + DateUtil.now()));
// 等待所有任务完成,验证效果
ThreadUtil.sleep(3000);
通过 CompletableFuture
的 allOf()
这个静态方法来并行运行 T1 和 T2 。当 T1 和 T2 都完成后,再利用 thenRunAsync()
方法执行 T3。
如果有一个任务失败了,你如何处理异常?
使用 CompletableFuture
的时候一定要以正确的方式进行异常处理,避免异常丢失或者出现不可控问题。
下面是一些建议:
- 使用
whenComplete
方法可以在任务完成时触发回调函数,并正确地处理异常,而不是让异常被吞噬或丢失。 - 使用
exceptionally
方法可以处理异常并重新抛出,以便异常能够传播到后续阶段,而不是让异常被忽略或终止。 - 使用
handle
方法可以处理正常的返回结果和异常,并返回一个新的结果,而不是让异常影响正常的业务逻辑。