直接上面试题吧,一面面试官很nice,有不会的会耐心引导,可惜自己太菜,二面面试官很快结束战斗,让我拍屁股走人了,自己水平太菜,以后继续努力吧!
一面:
1、介绍项目
2、说下索引的优点,自己谈的建立了索引就像是给一本书加了一个目录,这样的话去查找目录自然比一条条的去书里面查每一行文字要快的多。画出索引的结构图,这个在《高性能mysql》上看过,并说了InnoDB中主键索引跟二级索引叶子节点的区别,以及myISAM索引,说了下B+树的结构,以及这种结构非常适合于磁盘读写,可以减少IO次数,从而提高性能等。
3、讲讲Spring中最主要的特性,讲了下IOC跟AOP的个人理解。重点讲了IOC,IOC是控制反转,在不用spring控制反转前,我个人的习惯做法是在A类中依赖一个B类对象时,一般会自己手动new一个B类的对象出来,然后再进行使用,有了spring的IOC之后我便可以在配置文件中决定我生成哪个B类对象,然后在需要B类对象的地方只需要注入就可以了。这样降低了A跟B之间的耦合度,如果我要使用不一样的B的子类生成B类对象时,只需要修改配置文件,这样的效果是很不错的。有了IOC之后,创建对象的权利由我们手中转移到了spring框架中,减少了我们的工作量。
4、讲下jvm。主要谈了jvm的分区,以及每个分区的作用,谈堆区的时候又谈到了堆区分为新生代、老年代跟永久代。然后谈了新生代包括Eden区、Survivor区,然后Survivor区分为From跟To,以及在Eden区不足时会进行minor GC,然后什么比较大的对象会直接进入老年代了,以及什么时候进行Full GC了等等。
5、讲下数组跟链表的区别及各自的优缺点。既然这两种结构都有优点及不足,怎样能充分利用这两种结构的优点,然后当时首先进入自己脑子中的就是HashMap,然后谈了些HashMap的原理,提了些java8里面为解决拉链法造成链太长而使用红黑树了等等。
6、接我上面提到的HashMap,面试官又问了HashMap是否线程安全,什么是线程安全的。自己说了下ConcurrentHashMap,谈了些它的分段锁提高并发等。
7、说下AtomicInteger的原理,这个自己不太清楚,直接说的没太了解过。
8、说下HIVE,自己就说了些hive将sql映射成mapreduce任务等。
9、讲讲HBase,自己说了下它包括哪些部分,以及怎么存贮等。
10、讲讲Hadoop,自己主要说了HDFS以及mapreduce,还是拿经典的wordcount举例子。
11、说说linux中怎么统计一个文件中各个单词出现的次数,说下用到哪些命令就行。
12、给出了一个场景,假设有3台服务器来处理来到的请求,第一台服务器可以处理30个请求,第二台可以处理70个请求,第三台处理120个请求,如何实现在分配请求的服务器上时时分发请求,提示将三台服务器的IP作为key,value中的value。后面又提示往TreeMap上想,这个没答好。
13、说出TCP建立释放过程,自己画了TCP的三次握手跟四次挥手示意图。问了为什么四次挥手时需要2MSL等待。
14、说下TCP跟HTTP中keepalive的区别。
15、找第K大元素,说出快排的平均时间复杂度。
16、找前k大元素,说了还可以使用快排,堆排序也可以。
17、手写单例模式,写了懒汉:
public class Singleton{
private static Singleton sg;
private Singleton(){}
public synchronized static getInstance(){
if(sg==null){
sg = new Singleton();
}
return sg;
}
}