互联网公司校招Java面试题总结及答案——美团

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/d12345678a/article/details/54376784
因为有很多是重复的,所以其他的请参看我的总结系列文章:
互联网公司校招Java面试题总结及答案——京东
( 百度Java面经)互联网公司校招Java面试题总结及答案——百度(目前只是部分总结)
--------------------------------------我自己的三面面经-----------------------------------------------
一面:
1.了解面向服务框架SOA,微服务吗?
面向服务的架构(SOA)是一个组件模型,它将应用程序的不同功能单元(称为服务)通过这些服务之间定义良好的接口和契约联系起来。接口是采用中立的方式 进行定义的,它应该独立于实现服务的硬件平台、操作系统和编程语言。这使得构建在各种各样的系统中的服务可以以一种统一和通用的方式进行交互。
微服务:彻底的组件化和服务化,Docker容器,进程隔离; 微服务的目的是有效的拆分应用,实现敏捷开发和部署
2.分布式系统如何负载均衡?如何确定访问的资源在哪个服务器上?
一.轮询。二.随机。三.最小响应时间。四. 最小并发数。五.一致性哈希。
3.设计一个分布式负载均衡缓冲系统,如何快速定位到是那个服务器(使用key分段、一致性hash)
4.如何保证缓冲区和数据库之间的强一致性(使用加锁)
事务,锁,
“先淘汰缓存,再修改数据库”
“先操作缓存,在写数据库成功之前,如果有读请求发生,可能导致旧数据入缓存,引发数据不一致”
写流程:
1 )先淘汰cache
2 )再写db
读流程:
1 )先读cache ,如果数据命中hit 则返回
2 )如果数据未命中miss 则读db
3 )将db 中读取出来的数据入缓存
其实不需要让全局的请求串行化,而只需要“让同一个数据的访问能串行化”就行
在一个服务内,如何做到“让同一个数据的访问串行化”,只需要“让同一个数据的访问通过同一条DB 连接执行”就行。
如何做到“让同一个数据的访问通过同一条DB 连接执行”,只需要“在DB 连接池层面稍微修改,按数据取连接即可”
获取DB 连接的CPool.GetDBConnection() 【返回任何一个可用DB 连接】改为
CPool.GetDBConnection(longid) 【返回id 取模相关联的DB 连接】
能否做到同一个数据的访问落在同一个服务上?
可以,同样是用id去区分。
由于数据库层面的读写并发,引发的数据库与缓存数据不一致的问题(本质是后发生的读请求先返回了),可能通过两个小的改动解决:
1 )修改服务Service 连接池,id 取模选取服务连接,能够保证 同一个数据的读写都落在同一个后端服务上
2 )修改数据库DB 连接池,id 取模选取DB 连接,能够保证 同一个数据的读写在数据库层面是串行的
5.HashMap高并发情况下会出现什么问题,(扩容问题)
6.说一说在浏览器中输入一个url后,直到浏览器显示页面的过程中发生了什么(我主要说了DNS,然后他有接着问了DNS的细节,然后就是ARP路由,然后服务器处理,返回,浏览器呈现,获取html中的依赖资源)
7.字符串中句子的反转(比如ABC DEF,输出DEF ABC)(很简单,可以先反转整个字符串,然后反转单词,或者先将句子切分为单词,然后反转);
8.给任意二叉树的所有结点加next指针(这个有原题,也可以参考按层打印二叉树)。
9.用过反向代理吗?

二面:
1.进程间共享内存的方式有哪些?(8种)
无名管道,有名管道,高级管道,信号量,消息队列,共享内存,套接字。
2.linux下如何查看网络端口状态(netstat),如何查看内存使用情况(top);

3.ConcurrentHashMap如何扩容,内部结构?
4.知道java的异常吗?
5.运行时异常如果不处理会怎么样?应该怎么处理运行时异常?
不会怎么样,会在运行的时候出错。(RuntimeError是uncheck异常,所以不需要捕获)
6.写代码:给你5000万个int,求出前1000个最大的数,有2G内存。(我刚开始以为5000万个int很多,还把G和byte的换算忘了,后来面试官指导才想起来。我的方法是维护一个1000的小根堆,然后遍历数组,总体下来时间复杂度是O(nlg1000))
见排序的堆排序。
7.给你n个不重复的整数,随机找出m个不重复的整数,要求时间和空间复杂度都是O(m)。(方法很简单,就是每次把取出来的数放到后面,只在前面的数组随机访问就可以了,时间复杂度是O(m),空间复杂度是O(1),不过我刚开始没有想到把选出来的放后面去。。。)。
8.对于SQL慢查询的优化?(主要是从查询语句和数据库表设计两个方面来考虑,查询语句方面可以增加索引,增加查询筛选的限制条件;数据库表设计的时候可以拆分表,设计得更细粒度。但是后来才发现面试官想要的就是查询大量数据的慢查询问题的优化。。。)
先使用explain等找到耗时的地方,然后针对性的优化。SQL语句的优化。应该是需要针对业务数据进行一些特殊的优化。比如数据分类等。如果无法改变数据库设计,那就只能优化SQL语句,改变数据库参数设置了。
9.用过哪些容器?(tomcat)对比过Tomcat与其他服务器的区别吗?比如nginx?
nginx常用做静态内容服务和代理服务器,Tomcat能够 动态的生成资源并返回到客户端。
Nginx 应该叫做「HTTP Server」;而 Tomcat 则是一个「Application Server」,或者更准确的来说,是一个「Servlet/JSP」应用的容器;
虽然Tomcat也可以认为是HTTP服务器,但通常它仍然会和Nginx配合在一起使用:
  • 动静态资源分离——运用Nginx的反向代理功能分发请求:所有动态资源的请求交给Tomcat,而静态资源的请求(例如图片、视频、CSS、JavaScript文件等)则直接由Nginx返回到浏览器,这样能大大减轻Tomcat的压力。
  • 负载均衡,当业务压力增大时,可能一个Tomcat的实例不足以处理,那么这时可以启动多个Tomcat实例进行水平扩展,而Nginx的负载均衡功能可以把请求通过算法分发到各个不同的实例进行处理。
10.用过动态代理吗?以后会经常用到的
AOP。
11.有遇到过OOM吗?

三面:
1.自我介绍,说说你项目中的数据流向(画结构框图)
2.看过什么书?
3.说说深入理解JVM中印象最深刻的章节(我说了JVM内存模型,垃圾回收和类加载);
补充:还问了堆和栈中存的是什么?static修饰的变量存在哪里?(方法区)
4.说说《Effective Java》中你印象最深的三条和你的理解
能不用string的就不使用;
用静态工厂方法代替构造器;
不要过度使用异常;
重写equals方法;
重写equals方法的时候记得重写hashcode;
使类和成员的可访问性最小化等等。
5.你觉得你哪一块只是最熟悉(我说了Java的基本数据结构)
6.那你说说HashMap的内部实现;
jdk1.8是用的红黑树,之前用的Entry数组,而Entry是一个链表类型的数据结构。
7.HashMap是线程安全的吗?(不是,ConcurrentHashMap是)
8.那ConcurrentHashMap内部是如何实现的?每个segment是个什么数据结构?(HashTable)
由多个segment组成,每个segment是一个HashEntry数组,HashEntry是链表。
实现同步的方法是segment继承了ReentrantLock类;Hashtable实现线程安全的方法是使用synchronized。
9.你的项目中用到哪些技术?(Spring)
10.说说你用了它的什么?(Spring IOC用的最多)
11.Spring的优点?Spring AOP的原理?Spring如何实现解耦合?
1.使用Spring的IOC容器,将对象之间的依赖关系交给Spring,降低组件之间的耦合性,让我们更专注于应用逻辑。
2.可以提供众多服务,事务管理,WS等。
3.引入AOP技术,将公共服务抽象出来,简化了代码编写;
4.对主流的框架提供了很好的集成支持,方便继承各种优秀的框架;
5.Spring属于低侵入,代码污染极低。
6.降低Java EE API的使用难度;
12.对链表了解吗?(我说是List吗)是,(了解ArrayList和LinkedList),那你说说他们的区别?
13.会做链表两个结点的交换吗?(链表反转吗?)是的,你写代码实现把。
14.再写一个,给你一个链表和一个整数k(k大于等于0,小于等于链表长度,链表长度未知),按k步长反转链表(比如1->2->3->4->5->6->7,当k=3的时候结果是3->2->1->6->5->4->7)
15.说说mybatis配置了xml过后是如何完成数据库操作的?
16.static变量内存分配在哪里?
在方法区,方法区用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译后的代码等。


1.判断一个数是不是丑数
2.打印树的每一层最右侧节点
public void printRight(TreeNode root){
if(root == null)
return;
LinkedList<Integer> queue = new LinkedList<Integer>();
queue.add(root);
int cur = 1;
int nextLine = 0;
int curSum = 1;
while(!queue.isEmpty()){
TreeNode tmp = queue.poll();
if(curSum == cur)
System.out.print(tmp.val+",");
cur--;
if(tmp.left != null){
queue.add(root.left);
nextLine++;
}
if(tmp.right!= null){
queue.add(root.right);
nextLine++;
}
if(cur == 0){
cur = nextLine;
curSum = nextLine;
nextLine = 0;
}
}
}
3.HashMap 的原理,实现简单的 get/put 操作;
4.map 源码,怎样解决冲突,和扩容
5.servlet流程
init->service->destory;
6.序列化,以及json传输
7.tomcat均衡方式 ,netty
8.java的反射机制
运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。


-------------------------------------网上的美团---------------------------------------------------------
1.java中hashMap结构,处理冲突方法,还有啥方法,各个方法优缺点。
 1.开放定址法,这种方法也称再散列法,其基本思想是:当关键字key的哈希地址p=H(key)出现冲突时,以p为基础,产生另一个哈希地址p1,如果p1仍然冲突,再以p为基础,产生另一个哈希地址p2,…,直到找出一个不冲突的哈希地址pi ,将相应元素存入其中。
2.再哈希法,这种方法是同时构造多个不同的哈希函数:
    Hi=RH1(key)  i=1,2,…,k
当哈希地址Hi=RH1(key)发生冲突时,再计算Hi=RH2(key)……,直到冲突不再产生。这种方法不易产生聚集,但增加了计算时间。
3.  链地址法,这种方法的基本思想是将所有哈希地址为i的元素构成一个称为同义词链的单链表,并将单链表的头指针存在哈希表的第i个单元中,因而查找、插入和删除主要在同义词链中进行。链地址法适用于经常进行插入和删除的情况。
4.建立公共溢出区,这种方法的基本思想是:将哈希表分为基本表和溢出表两部分,凡是和基本表发生冲突的元素,一律填入溢出表。
3.红黑树。

4.进程调度;
无论是在 批处理系统还是 分时系统中,用户进程数一般都多于 处理机数、这将导致它们互相争夺处理机。另外,系统进程也同样需要使用 处理机。这就要求进程调度程序按一定的策略,动态地把 处理机分配给处于就绪队列中的某一个 进程,以使之执行。
调度算法:
先来先服务和短作业(进程)优先调度算法,高优先权优先调度算法,基于时间片的轮转调度算法。
5.页面置换;
在地址映射过程中,若在页面中发现所要访问的页面不在内存中,则产生 缺页中断。当发生缺页中断时,如果操作系统内存中没有空闲页面,则 操作系统必须在内存选择一个页面将其移出内存,以便为即将调入的页面让出空间。而用来选择淘汰哪一页的规则叫做页面置换算法。
先入先出(FIFO)法。这种算法的实质是,总是选择在主存中停留时间最长(即最老)的一页置换,即先进入内存的页,先退出内存。
当需要置换一页时,选择在之前一段时间里最久没有使用过的页面予以置换。这种算法就称为最久未使用算法
8.spring,quartz,spark,lucene,
Quartz是一个完全由Java编写的开源作业调度框架,为在Java应用程序中进行作业调度提供了简单却强大的机制。
Spark 是一种与 Hadoop 相似的开源集群计算环境。
lucene:是一个 开放源代码的全文检索引擎工具包,但它不是一个完整的全文检索引擎,而是一个全文检索引擎的架构,提供了完整的查询引擎和索引引擎,部分 文本分析引擎。
9.自己实现IOC
10.const/reactor
Reactor 是一个基于 JVM 之上的异步应用基础库。
12.volatile实现原理
它在多处理器开发中保证了共享变量的“可见性”。可见性的意思是当一个线程修改一个共享变量时,另外一个线程能读到这个修改的值。
  • 将当前处理器缓存行的数据会写回到系统内存。
  • 这个写回内存的操作会引起在其他CPU里缓存了该内存地址的数据无效。
处理器为了提高处理速度,不直接和内存进行通讯,而是先将系统内存的数据读到内部缓存(L1,L2或其他)后再进行操作,但操作完之后不知道何时会 写到内存,如果对声明了Volatile变量进行写操作,JVM就会向处理器发送一条Lock前缀的指令,将这个变量所在缓存行的数据写回到系统内存。但是就算写回到内存,如果其他处理器缓存的值还是旧的,再执行计算操作就会有问题,所以在多处理器下,为了保证各个处理器的缓存是一致的,就会实现缓存一致性协议,每个处理器通过嗅探在总线上传播的数据来检查自己缓存的值是不是过期了,当处理器发现自己缓存行对应的内存地址被修改,就会将当前处理器的缓存行设置成无效状态,当处理器要对这个数据进行修改操作的时候,会强制重新从系统内存里把数据读到处理器缓存里。
缓存一致性机制会阻止同时修改被两个以上处理器缓存的内存区域数据一个处理器的缓存回写到内存会导致其他处理器的缓存无效
13.spring的一些知识,如:有哪些注入方式
三种:通过set方式注入,通过构造器注入,通过工厂方法(接口注入,具有侵入性,不推荐)
XML配置,Java注解,构造器。
14.boolean占几个字节,protected权限能否被包外访问
因为jvm没有boolean类型,所以如果jvm实现规范的话,那么如果是boolean类型的数组的话,每个boolean类型(按照byte数组存储)占用1bytes,否者按照int类型存储,占用4bytes.得出 boolean类型占了单独使用是4个字节,在数组中又是1个字节
protected权限不能被包外访问。

16.说怎么判断是一个人注册大量小号。
从判断注册页面过来的请求是否是同一IP之类的说了
问题1:美团面试官来到一个城市面试应聘者,面试有三天,每天面试官上午可以面试三场,下午可以面试四场,怎么设计面试系统,面试者可以选择面试日期,面试时间和面试官。
标记,同步,
问题2:有一些爬虫IP不断的访问美团网站,现在美团设定一个IP5分钟之内访问美团网站超过100次,就判定为爬虫IP,怎么设计这个程序?如果100改成10000,怎么设计?
读取log中的IP记录,并统计每个IP的访问次数,以5分钟为分隔,超过100的IP就是爬虫IP,没有超过的在5分钟的时候清零,继续统计。

附上我周一参加的美团面经:
一面:
1.了解SOA,微服务吗?
2.分布式系统如何负载均衡?如何确定访问的资源在哪个服务器上?
一.轮询。二.随机。三.最小响应时间。四. 最小并发数。五.哈希。
3.设计一个分布式负载均衡缓冲系统,如何快速定位到是那个服务器(使用key分段、一致性hash)
4.如何保证缓冲区和数据库之间的强一致性(使用加锁)
5.HashMap高并发情况下会出现什么问题,(扩容问题)
6.说一说在浏览器中输入一个url后,直到浏览器显示页面的过程中发生了什么(我主要说了DNS,然后他有接着问了DNS的细节,然后就是ARP路由,然后服务器处理,返回,浏览器呈现,获取html中的依赖资源)
7.字符串中句子的反转(比如ABC DEF,输出DEF ABC)(很简单,可以先反转整个字符串,然后反转单词,或者先将句子切分为单词,然后反转);
8.给任意二叉树的所有结点加next指针(这个有原题,也可以参考按层打印二叉树)。
9.用过反向代理吗?

二面:
1.进程间共享内存的方式有哪些?(8种)
2.linux下如何查看网络端口状态(netstat),如何查看内存使用情况(top);
3.ConcurrentHashMap如何扩容?
4.知道java的异常吗?
5.运行时异常如果不处理会怎么样?应该怎么处理运行时异常?
6.写代码:给你5000万个int,求出前1000个最大的数,有2G内存。(我刚开始以为5000万个int很多,还把G和byte的换算忘了,后来面试官指导才想起来。我的方法是维护一个1000的小根堆,然后遍历数组,总体下来时间复杂度是O(nlg1000))
7.给你n个不重复的整数,随机找出m个不重复的整数,要求时间和空间复杂度都是O(m)。(方法很简单,就是每次把取出来的数放到后面,只在前面的数组随机访问就可以了,时间复杂度是O(m),空间复杂度是O(1),不过我刚开始没有想到把选出来的放后面去。。。)。
8.对于SQL慢查询的优化?(主要是从查询语句和数据库表设计两个方面来考虑,查询语句方面可以增加索引,增加查询筛选的限制条件;数据库表设计的时候可以拆分表,设计得更细粒度。但是后来才发现面试官想要的就是查询大量数据的慢查询问题的优化。。。)
9.用过哪些容器?(tomcat)对比过Tomcat与其他服务器的区别吗?比如nginx?
10.用过动态代理吗?以后会经常用到的

三面:
1.自我介绍,说说你项目中的数据流向(画结构框图)
2.看过什么书?
3.说说深入理解JVM中印象最深刻的章节(我说了JVM内存模型,垃圾回收和类加载);
补充:还问了堆和栈中存的是什么?static修饰的遍历存在哪里?(方法区)
4.说说《Effective Java》中你印象最深的三条和你的理解
5.你觉得你哪一块只是最熟悉(我说了Java的基本数据结构)
6.那你说说HashMap的内部实现;
7.HashMap是线程安全的吗?(不是,ConcurrentHashMap是)
8.那ConcurrentHashMap内部是如何实现的?每个segment是个什么数据结构?(HashTable)
9.你的项目中用到哪些技术?(Spring)
10.说说你用了它的什么?(Spring IOC用的最多)
11.Spring的优点?Spring AOP的原理?Spring如何实现解耦合?
12.对链表了解吗?(我说是List吗)是,(了解ArrayList和LinkedList),那你说说他们的区别?
13.会做链表两个结点的交换吗?(链表反转吗?)是的,你写代码实现把。
14.再写一个,给你一个链表和一个整数k(k大于等于0,小于等于链表长度,链表长度未知),按k步长反转链表(比如1->2->3->4->5->6->7,当k=3的时候结果是3->2->1->6->5->4->7)
15.说说mybatis配置了xml过后是如何完成数据库操作的?

猜你喜欢

转载自blog.csdn.net/d12345678a/article/details/54376784