博主近期面试了百度网盘的Android开发高级工程师职位,好多人都问我在BAT面试大神们都会问些什么问题,所以我在这里整理了一下,我就不再写面试的流程什么的了,博主过了一面和二面,三面在等通知,其中一面和二面问的全是纯技术,三面问的近期做的项目相关,比如遇到哪些困难,怎么解决的,架构是如何搭建的等等,又聊了些以后的职业规划,面试的感觉还是很不错的,这是近三年来,我的第一个面试,所以准备得不够充分,发挥的不太好,也就发挥出了百分之六七十的实力,不多说了,直接上干货(问题不分先后顺序,不分一二三面顺序):
一、Java相关
1、Java垃圾回收机制。
2、JVM虚拟机的原理以及类加载机制。
3、说几种用过的设计模式,选其中一种画出UML图,并在纸上写出代码。
4、写一个观察者模式
5、写一个单例模式,说出单例模式的优缺点,什么情况下要用单例模式?
6、介绍一下Java的数据结构。
7、请简要说明下观察者模式和接口回调的区别,比如一个网络请求方法:public void request(Callback c),其中Callback 是interface类型,为什么不是class类呢?有什么区别?
8、如何创建线程池?请说出优缺点。
9、用过哪些支持并发的集合?
10、HashMap和HashTable的区别,以及HashMap的原理。
11、说一下MVP、MVC、MVVM。
12、说一下代理模式,动态代理和静态代理有什么区别?原理是什么?
13、算法题:如何创建一个长度为n的链表?写一个算法,算出该链表的倒数第k个节点.
14、算法题:在B线程打印到5的时候,A线程开始打印。请用多种方法实现。
public static void main(String[] args) {
new Thread(new TaskA()).start();
new Thread(new TaskB()).start();
}
static class TaskA implements Runnable {
@Override
public void run() {
for (int i = 0; i < 20; i++) {
System.out.print("i=:" + i);
}
}
}
static class TaskB implements Runnable {
@Override
public void run() {
for (int i = 0; i < 20; i++) {
System.out.print("i=:" + i);
}
}
}