美团点评校招最后一批做的的笔试题,一直没消息,以为挂了。没想到11月初,都快签了,收到了面试邀约。邮箱里还躺着Oracle的笔试邀约,心中五味杂陈。学校在岛城,去一趟帝都不容易啊,纠结中。
笔试题: https://github.com/wuping5719/Algorithm/tree/master/2-Java-Interview/2-31-NewMeiDa
收到美团邀约时已签其他公司,搜集的面经,根据面经看书,更有针对性。
-
1.把一颗二叉树同层的节点用next指针链接起来.
http://www.cnblogs.com/shawnhue/p/leetcode_116_117.html -
2.Spring Bean对象的生命周期.
Spring Bean的生命周期(非常详细): http://www.cnblogs.com/zrtqsk/p/3735273.html -
3.计算机网络中的同步和异步.
计算机网络-步传输和异步传输(理解): http://blog.csdn.net/thisispan/article/details/7481127 -
4.服务器的多线程和IO复用的应用场景,IO复用是什么复用?
1) 多线程的应用场景:
(1) 线程间有数据共享,并且数据是需要修改的(不同任务间需要大量共享数据或频繁通信时);
(2) 提供非均质的服务(有优先级任务处理)事件响应有优先级;
(3) 任务并行计算,在非CPU Bound的场景下提高响应速度,降低时延;
(4) 与人有IO交互的应用,良好的用户体验(键盘鼠标的输入,立刻响应).
2) IO复用的应用场景:
(1) 当客户处理多个描述字时(交互式输入以及网络接口),必须使用IO复用;
(2) 一个客户同时处理多个套接口;
(3) 一个tcp服务程序既要处理监听套接口,又要处理连接套接口,一般需要用到IO复用;
(4) 如果一个服务器既要处理TCP,又要处理UDP,一般也需要用到IO复用;
(5) 如果一个服务器要处理多个服务或者多个协议,一般需要用到IO复用。
linux提供了select、poll、epoll等方法来实现IO复用.
3)IO复用: 单个线程,通过记录跟踪每个I/O流(sock)的状态,来同时管理多个I/O流。
-
5.进程和线程的概念,进程间通信的方式,消息队列和共享内存的适用场景.
1) 进程与线程的一个简单解释:
http://www.ruanyifeng.com/blog/2013/04/processes_and_threads.html
2) 进程间通信的方式:
进程间8种通信方式:
(1) 无名管道(pipe):管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用。
进程的亲缘关系通常是指父子进程关系。
(2) 高级管道(popen):将另一个程序当做一个新的进程在当前程序进程中启动,则它算是当前程序的子进程,这种方式我们成为高级管道方式。
(3) 有名管道(named pipe):有名管道也是半双工的通信方式,但是它允许无亲缘关系进程间的通信。
(4) 消息队列(message queue):消息队列是由消息的链表,存放在内核中并由消息队列标识符标识。消息队列克服了信号传递信息少、管道只能承载无格式字节流以及缓冲区大小受限等缺点。
(5) 信号量(semophore):信号量是一个计数器,可以用来控制多个进程对共享资源的访问。它常作为一种锁机制,防止某进程正在访问共享资源时,其他进程也访问该资源。因此,主要作为进程间以及同一进程内不同线程之间的同步手段。
(6) 信号 (sinal):信号是一种比较复杂的通信方式,用于通知接收进程某个事件已经发生。
(7) 共享内存(shared memory) :共享内存就是映射一段能被其他进程所访问的内存,这段共享内存由一个进程创建,但多个进程都可以访问。共享内存是最快的 IPC 方式,它是针对其他进程间通信方式运行效率低而专门设计的。它往往与其他通信机制,如信号量配合使用,来实现进程间的同步和通信。
(8) 套接字(socket):套接口也是一种进程间通信机制,与其他通信机制不同的是,它可用于不同机器间的进程通信。
3) 消息队列和共享内存的适用场景:
http://www.cnblogs.com/biyeymyhjob/archive/2012/11/04/2753535.html -
6.数据库的优化,索引为什么用B树,有什么好处?
B树在数据库索引中的应用剖析:http://www.idouba.net/about-btrees-application-in-database-index-in-programmer/
深入浅出空间索引:为什么需要空间索引: http://www.cnblogs.com/LBSer/p/3392491.html
一面:
- 1.了解SOA,微服务吗?
- 2.分布式系统如何负载均衡?如何确定访问的资源在哪个服务器上?
(1)轮询; (2)随机; (3)最小响应时间; (4)最小并发数; (5)哈希。
http://www.open-open.com/lib/view/open1446377378148.html - 3.设计一个分布式负载均衡缓冲系统,如何快速定位到是那个服务器?(使用key分段、一致性hash)
- 4.如何保证缓冲区和数据库之间的强一致性?(使用加锁)
- 5.HashMap 高并发情况下会出现什么问题?(扩容问题)
- 6.说一说在浏览器中输入一个 url 后,直到浏览器显示页面的过程中发生了什么?
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内存。
维护一个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 哪一块是最熟悉的(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 过后是如何完成数据库操作的?
- 1.求树中两个节点的最低公共祖先
Java版:http://blog.csdn.net/jingshuigg/article/details/31048141