美团后端面试大全【附答案】

这篇博客详细记录了一位求职者在美团后端面试的全过程,涵盖了一面、二面、三面的主要问题,涉及Java基础、数据结构、并发编程、Spring框架、JVM内存管理、数据库优化、网络知识等多个方面。面试官注重考察候选人的实际理解和应用能力,如HashMap、线程池、反射、锁机制、MySQL优化等,并要求候选人现场编写代码。博客内容还包含了面试者的反思和建议,如对Kafka、Zookeeper、中间件等技术的深入学习,以及对异常场景的思考和解决方案设计。
摘要由CSDN通过智能技术生成

1.平时用什么技术栈啊 如实回答Java用的比较多
2.Java集合了解吗 说说都有啥 List Set Map 如实说Set不咋用 面试官也没刁难我=。=
3.说一下List和Map各自适用的场景
4.ArrayList
5.hashmap
6.反射了解吗 (不太熟啊) 就说了spring的IOC和AOP是基于反射的
7.那你就说说IOC和AOP吧 (挖坑神作)
8.多线程了解吗 说说优缺点 主要 有啥缺点 那缺点怎么解决 (就死锁啥的 瞎bb了一通)
9.synchronize讲一讲
10.你都了解过什么锁 都说一说
11.Threadlocal了解吗 (这个没咋看 就知道和同步的效果一样)
12.jvm了解吗 说说他是干嘛的
13.那既然你说到了GC 那就讲讲Java的GC吧 (又一挖坑)
14.BIO NIO AIO 的区别
15.mysql了解吗 说说mysql的引擎都有啥 有啥优缺点
16.那你再说说聚簇索引和非聚簇索引吧 为啥用B+树啊
17.最后是一个算法题 披着一个外衣的约瑟夫环问题 (我没看出来啊!!!!磨磨蹭蹭了半天说思路卡住了 跟他讲了讲想到的思路 )

自我介绍
项目相关
讲一下实习期间的做的事情?
回答:使用消息队列kafka进行削峰
追问:
如何解决消息漏发,消息重复问题?
如何解决消息多次消费的问题?
当你将消息读取到内存且还没处理完,服务这时候宕机了,该怎么办?如何保证消息只被消费一次呢?
关键点:
了解 Kafka 生产的和消费消息的过程
了解 Kafka 幂等性
谈谈你对kafka的理解和认识
谈谈kafka的消费者和消费组?
讲讲实习另一个使用,基于zookeeper的分布式定时器?
定时器定期检查,还有什么方法解决你这个问题嘛?
面试官:可以考虑用消息队列
谈谈zookeeper的认识?
zookeeper核心提供了什么样的能力呢?
zookeeper如何实现分布式一致性?
面试官建议:再深入了解一下这些框架的原理
聊聊其他的项目。【此时进入到SSM】
为什么在分布式情况就要用redis存储session
session使用redis存储,还有什么解决方案嘛?
小声回答:感觉DB可以实现功能,但性能不好吧
DB的大概性能是多少?Redis的大概性能是多少?两者相差多少?
Redis
谈谈你对Redis的理解?
为什么单线程它会快?
为什么多路复用会快?
poll和epoll的区别?
说一下五种IO模型,以及如何区别它们?
redis的缓存淘汰机制?
LRU如何实现?
Java
你比较了解Java的哪一块知识?
hashmap的底层数据结构?
为什么要用红黑树?插入性能如何?
concurrentHashMap了解嘛?
谈谈对线程池的认识?
常见的线程池?
这四个常用的线程池各自的应用场景?
cached线程池,在大量请求下会有什么问题?
Spring
谈谈对spring的认识
Ioc是什么?Ioc的作用?
aop是什么?它的动态代理用什么实现的?
TCP
TCP连接经历什么阶段?
TCP和UDP的区别?
面向连接和无连接的区别?
在物理层,TCP和UDP有区别嘛?
反问
问:面试官所属部门?

问:校招,比较看重应聘者哪些能力?
答:解决问题,学习能力,基础知识,价值观

问:面试官,觉得自己在哪方面还需要提高的?
答:

一些知识需要更深入学习
设计的技术方案多进行横向对比
多思考,不同场景下,不同的解决方案
总结
Kafka和zookeeper要更加深入了解一些原理
自己实现的技术方案,要考虑到一些异常场景,多进行横向对比
动态代理,IO模型等基础知识牢固一点
1、自我介绍;
2、项目介绍;项目实现细节(面试官问自己感兴趣的内容)
3、servlet的特点?
4、servlet和MVC的区别?
5、mybatis的特点?
6、JAVA基础内容,解释下多态?
7、说一下你碰见过的异常?
8、你见过的error有哪些?
9、内存溢出相关的有了解吗?
10、数据结构有了解嘛?
11、字符串拼接的方式?
12、描述下链表? 和数组的区别?
13、描述下数组和链表添加数据的过程?
14、如何判断链表中是否有环?
15、问了一些校内活动及收获
16、反问

晚7点,因为想到下周一才面试,我刚准备出去打个羽毛球,北京的电话就来了。面试官各种抱歉,说开会拖延了。

1、自我介绍
说了很多遍了,很流畅捡重点介绍完。

2、问我数据结构算法好不好
挺好的(其实心还是有点虚,不过最近刷了很多题也只能壮着胆子充胖子了) 。

3、找到单链表的三等分点,如果单链表是有环的呢
用快慢指针,一个走一步,一个走三步。如果有环,先判断环在哪,找最后一个节点,然后用之前的无环的做法。

4、讲一下项目的架构
我重点讲了MVC。

5、说一下你熟悉的设计模式
我重点讲了单例、工厂方法、代理 。

6、有没有配置过服务器啥啥啥
这个我真不知道,都没听过呢,只能诚实说没有,毕竟都没法扯。

一面挺匆忙的,我估计面试官刚开完会还没吃饭呢。他说让我等,可能再找一个同事面我,可能就直接告诉我结果了。从一面面试官的声音和口吻,我判断他一定是个部门老大,问的设计偏多,后面hr告诉我他就是我要去的部门的老大。哈哈。

二面(60分钟)
面完一面正准备出去打羽毛球,北京的电话又来了。(注定这周五参加不了球队活动了!)

二面:跟一面比起来,二面面试官的声音听起来就像是搞技术开发的,果不其然,一个小时的纯技术电话面试!面的特别全面!

1、Spring:有没有用过Spring,Spring IOC、AOP机制与实现,Spring MVC

其实我挺不想被问到Spring的细节的,框架这些我都没有复习不太记得了。所以我对面试官说Spring里面的一些比较重要的机制我理解的还不错,然后我用一个实际的例子把我对IOC、AOP理解讲了一下,他听了说对,理解的不错(难得遇到一个边面试边能给反馈的面试官,好开心)。

Spring MVC其实我用过,我就对面试官讲了我的项目中用到的Servlet,jsp和javabean实现的MVC,以及MVC各个模块职责以及每个模块是怎么联系到一起的,最后我补充了一句我想SpringMVC的思想其实跟这个是一样的(他说对的,嘿嘿有反馈真好) 。

2、多线程:怎么实现线程安全,各个实现方法有什么区别,volatile关键字的使用,可重入锁的理解,Synchronized是不是可重入锁

这里我就主要讲了Synchronized关键字,还有并发包下面的一些锁,以及各自的优缺点和区别。volatile关键字我主要从可见性、原子性和禁止JVM指令重排序三个方面讲的,再讲了一下我在多线程的单例模式double-check中用到volatile关键字禁止JVM指令重排优化。

3、集合:HashMap底层实现,怎么实现HashMap线程安全

我讲了一下HashMap底层是数组加单链表实现,Node内部类,add的过程,Hash冲突解决办法,扩容,三种集合视图。HashMap线程安全的实现方式主要讲了HashTable、ConcurrentHashMap以及Collections中的静态方法SynchronizedMap可以对HashMap进行封装。以及这三种方式的区别,效率表现。

4、JVM内存管理,GC算法,HotSpot里面的垃圾回收器、类加载

JVM内存主要分为五个区,哪些是线程共享的,哪些是线程独享的,每个区存放什么。GC方面:怎么判断哪些对象需要被GC,GC的方法,Minor GC与Full GC。HotSpot GC算法以及7种垃圾回收期,主要讲了CMS和G1收集器。类加载:类加载的过程,Bootstrap classloader-ExtClassloader-AppClassloader,父类委托机制。

5、进程和线程的区别

从调度、并发性、拥有的资源和系统开销四个方面回答的。

6、HTTP有没有状态,我说无状态,怎么解决HTTP无状态

怎么解决HTTP无状态其实就是怎么进行会话跟踪,有四种方法:URL重写、隐藏表单域、Cookie、Session。

7、Java IO,NIO,Java中有没有实现异步IO

Java IO实现的是同步阻塞,它是怎么实现同步阻塞的。我拿了read()方法举例来讲的。NIO实现的是同步非阻塞,我详细讲了一下Selector中的select()方***询说明它是如何实现多路复用IO的。然后对比了一下他们的效率。面试官可能看我对这一块比较了解,又继续问我Java中有没有实现异步IO,我感觉好像没有,但面试官说有,让我想想,其实这里我并不清楚啦,所以我就对面试官讲了一下我对Unix中异步IO模型的理解,然后说至于Java里面有没有我真的不太清楚。(他居然笑了!说你理解是对的,Java里面有没有不重要!哈哈)

8、前端会不会,Ajax是什么,Ajax实现原理

前端我只是会用一些js而已,用过jquery框架,问我Ajax全称是啥,我猜是异步的js和xml。Ajax实现原理其实我也不懂,我就只简单讲了一下它通过XMLHttpRequest对象进行异步查询,Ajax引擎在客户端运行,减少了服务器工作量。

9、让我设计一个线程池

因为我简历中有写到我对多线程、并发这一块理解比较好。所以他老问这方面的题。这个问题因为我之前看过ThreadPoolExecutor的源代码,所以我就仿照那个类的设计思路来想的,详细讲了一下核心池、创建线程可以用工厂方法模式来进行设计、线程池状态、阻塞队列、拒绝策略这几个方面。设计的还算比较周全。

10、讲几个设计模式,哪些地方用到了,为什么要用

单例模式,jdk中的getRuntime();工厂方法模式,ThreadPoolExcutor用到ThreadFactory;观察者模式:java.util包下面的Observable和Observer。最后主要讲了一下工厂方法模式的使用场景。

11、Mysql优化、索引的实现

我从数据库设计优化和查询优化两方面讲的。索引B+树实现,InnoDB和MyISAM主键索引的实现区别,一个聚集一个非聚集。

12、事务的隔离级别

四种隔离级别,可能会出现哪些异常,mysql中默认级别。

13、有没有用过Hibernate、mybatis、git

这个简单讲一下就好,分别是干什么的。

14、Linux

我说这个本科学过,但是很久没用,命令忘光了。他说没事,考你几个简单的:cd、ls、dir(真的是简单的)。

15、算法题

从10万个数中找最小的10个,时间复杂度分析(最大堆,考虑内存) 。

从一个有正有负数组中找连续子数组的最大和,时间复杂度分析(动态规划)
满二叉树第i层有多少个节点,n层的满二叉树共有多少个节点。

终于到我提问环节了:

1、你们是什么部门(他说是核心部门,大数据研发) 。

2、我对高并发和负载均衡挺有兴趣的,但是我平时在学校也没有这个环境让我在这方面有所体验,那你建议我目前可以怎么学呢(他说这确实是不太好学,只能看些理论和别人的博客,以后工作中才能慢慢学) 。

3、中间件具体是做什么的,是解决高并发和负载均衡吗(他说差不多是的,然后他说我们这个部门不是中间件,是大数据部门啊,我说恩我知道) 。

最后没啥问题了,他让我保持电话畅通。

这一面面完,口干舌燥,我一度怀疑他可能不知道我是在应聘实习生的岗位。有太多要总结的了,放在总结的地方一起讲吧。

三面(25分钟)
面试官说是他是另外一个部门的,需要进行交叉面试。

1、MySql优化 。

2、说下项目做了些什么,架构之类的。

3、在collabedit上在线写代码,题目很简单是编程之美上的原题,一个有序的整数数组,输出两个数,使它们的和为某个给定的值。之前做过很快写好,然后给他讲思路。他继续问如果数组无序怎么办,先排序。

4、两个文件,每个文件中都有若干个url,找出两个文件中相同的url(用HashMap)
这一面挺简单的,只是增加之前面试没有过的在线写代码环节,collabedit后来我才了解,像facebook一些互联网公司远程面试都会用这个在线编辑器写代码,就是文本文档写,没有提示,不能编译运行,跟白板写一样。平时练练手就好。
2.说说epoll,noi.,epoll短时间事件很多怎么办
3.谈一谈读写锁,java怎么实现
4.进程线程区别
5.进程通信
6.c++地址分配,具体到类上
7.hashmap底层
8.url输入响应过程
9.MySQL聚族索引,覆盖索引

一、JavaSE部分
❤1、Java基础

1、为什么重写equals还要重写hashcode

答:(1)两个对象相等,hashCode则一定相等;(2)hashCode相等,两个对象不一定相等;为了提高程序的效率,先进行hashcode的比较,如果不同,不必要进equals的比较了。如果不重写hashCode()会降低Map等集合的索引速度。

2、说一下map的分类和常见的情况

HashMap: 线程不

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Nydia~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值