一、数据结构和算法
1.1数据结构
1.1.1排序算法
1.快速排序算法,手写代码(我面试时就问了这个)
2.冒泡排序
3.选择排序
4.二分查找(递归和迭代2种方式)
5.归并排序
1.2算法题
算法题推荐一本书,《编程之美》就够了,有条件的话,时间允许平时多多去LeetCode刷题,对以后的跳槽也是有帮助的。
1.2.1 常见算法题
1.N个数中求M个最大值(最小)!N个数,比如100000亿个数,只要1000个最大值(最小值)。需要考虑到时间复杂度,内存装不下这么多,所以考虑用最小堆(最大堆)来解决。建议自己百度,理清思路,一般你要知道解决问题思路,美团很少叫你手写代码实现(面试时)。
2.求数组的子数组之和的最大值
3.逆置一个单链表
http://blog.csdn.net/autumn20080101/article/details/7607148
4.逆置一个字符串,不用split实现
5.判断单链表是否有环
5.如何求一个有序链表的中位数
6.String转化为Int
7.求二树搜索树的最小差值
8.面试官问了《操作系统》LRU算法你了解吗?解释,其实就是最近最少使用算法,这个算法应用很多方面。度娘了解下就可以。
二、基础专业书相关问题
1.手写一个生产者-消费者模式的例子,手写代码
2.手画网络协议5层结构图
3.谈谈你对java的三大特性,封装 继承 多态 解释清楚,其中多态分为运行时多态和编译时多态。
运行时多态:解释,可以举例说明
编译时多态:解释,可以举例说明
4.何为重写?解释清楚
5.何为重载?解释清楚
三、源码深入理解
1.1 java Api源码
框架集合、IO、多线程。对于集合需要知道时间复杂度是多少。其中集合框架在并发线程情况下,同时对集合的修改会产生并发修改异常,自己百度了解加深印象。
1.1.1框架集合
1.1.1.1HashMap TreeMap
HashMap的底层结构,数组+链表,在JDK1.8中的改变是链表查找时间复杂度O(n),长度超过桶值8的时候就采用红黑树实现,查找时间复杂度O(log n),来提高效率。
https://zhuanlan.zhihu.com/p/21673805 HashMap
http://blog.csdn.net/canot/article/details/51240251 HashSet
1.1.1.2 HashSet TreeSet
1.1.1.3 ArrayList LinkedList
综合问题:
List<Person> list = new ArrarList<Person>();
如何对Person进行排序?
1.Person类实现Comparable接口,并实现CompareTo()方法;自然排序
2.写一个比较器Comparator,实现compare()方法,(使用方式)在创建list容器的构造方法中指定这个比较器。
1.2 SSM框架理解
1.2.1Spring
说出你对Spring的IOC和AOP的理解
1.2.2Mybatis
Mybatis的SQL语句中#{}占位符和${}拼接符号的区别?
#{}参加预编译,可以防止SQL注入;${}直接和SQL拼接,不参加预编译
1.2.3 Spring MVC 的执行流程?
四、设计模式
问你在Java何处运用了何种设计模式?请解释其中一种设计模式?并且手写代码!
3.1 单例设计模式(线程安全的2种,双重锁机制的和枚举类型的单例,手写代码)
http://cantellow.iteye.com/blog/838473 第6种 第7种单例模式最好,线程安全,手写就选这2种。
3.2 抽象工厂模式(理解和建造者模式创建对象的区别)
3.3 建造者模式
3.4 装饰设计模式,我说不了解java中运用的设计模式,但我知道这个装饰设计模式,所以引导到自己熟悉的设计模式说就行。
五、项目部分(这个跟你们的项目有关,提问也是根据项目提问)
我面试的时候就问你做了哪些项目,然后我就举例一个自己会做的项目。介绍下自己项目的模块,你自己负责的模块。
然后面试官叫手画 这个项目中相关 E-R 图,之后又叫你画 数据库表结构,主要就是列名。最后面试官看数据库表结构,说了叫你写几个SQL查询语句。
项目其实还会问你用到的技术,因为简历中有用到redis(nosql)数据库作为缓存,就问了redis的数据类型有哪些?(String List Hash Set SortedSet)还问了缓存穿透相关的问题和后台数据库更改了数据,怎么同步到redis缓存中。这个可能不会问,因为我简历中提到才问的。简历中没有,或者项目中没用到也是不会问的,建议直接忽略这个部分。
简历还写了全文检索技术lucene,所以问了倒排索引的结构item+document
六、提高部分
想提高水平的话简历中技能熟悉中需要提到部分,例如熟悉JVM虚拟机原理。推荐书籍:
6.1 jvm虚拟机
这部分需要在简历中提到,不然面试官不会问你,那就白准备了。可以引导面试官,说你了解一点虚拟机,然后自己说出来。至少将一下第一条弄懂,感觉太难的后面5条可以不用了解。
掌握程度:
1.要求画出虚拟机内存分布图?其中每一个部分的功能原理?以及哪些部分地方会出现什么异常?P 38-43
http://blog.csdn.net/wdjhzw/article/details/27720445 jvm最基础部分,内存结构图
2.Jvm的垃圾收集算法有哪些?解释下这些垃圾收集算法?(标记-清除 复制算法 标记-整理 分代收集算法)熟悉它们之间的区别与联系?P 69-72
3.虚拟机的对象垃圾回收中,如何判断对象已经已死(引用计数算法法和可达性分析算法)P 61-69
4.内存分配与回收策略?P 91-100
5.Jvm类加载的生命周期?P 210-226 这部分要知道7个生命周期阶段,以及每个阶段做什么!
6.类加载的双亲委派机制模型的原理?P 231
6.2数据库优化
简历中可以写了解 数据库优化,这样面试官就有可能问你。
数据库优化都有哪些?SQL优化 索引优化 数据表结构优化 拆分表
其中可能会问:SQL你是怎么优化的,查百度,命令行窗口登入mysql –uroot –proot 登录mysql后,利用explian + SQL 语句 是预执行SQL语句在数据库中的执行计划,结果返回有rows的一列值,例如rows: 1000 说明需要扫描磁盘1000次,因为磁盘速度慢,越多的IO导致查询性能慢;property key:NULL,说明没有用索引,可以选择在SQL语句中利用索引提高查询性能。
Mysql中的索引结构了解吗?涉及到B+树,这个也很重要,自己查百度。
事务的特性ACID,包含:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)。
A:原子性,事务是一个不可分割的独立单元,也就是事务不可再分。
C:一致性,事务中的语句要么全部执行成功,要么全部执行失败,不能一部分执行成功,一部分执行失败。
I:隔离性,任何一个事务的执行不会被其他事务影响。
D:持久性,事务一但执行,对数据库的影响是持久的,不能改变。
数据库设计的三大范式?百度吧
绿色是我那次面试中问到的,不一定会问一样的,毕竟面试官很多。红色表示重要,灰色可以不用理会,如果你简历有,也对这部分知识有信心,那你就简历中写上,万一面试官看到就问到了。
对于简历:如果有不会的东西,简历中就别写,万一问了,不会那就很尴尬。面试中主动些,多多跟面试官沟通会留下好印象,面试官问的方式你不清楚,你要主动多问,多沟通。
由于我面试的是Java后台,所有web的学弟学妹需要自己查百度。下面是一个别人java后台面试的美团成功经验网页。
百度:java后台/web前端美团面试经验,以下百度搜索到的几个链接可以参考下。
Java后台http://blog.csdn.net/csuliyajin2012/article/details/49430659
Web前端http://www.kanzhun.com/gsmsh4336033.html
Web 前端 看准网 http://www.kanzhun.com/msh/g711383-z2117/
运维的学弟自己查百度看看喽