百度Android 123面面经 9/12(已OC+意向)
百度Android 1面 48分钟:
开局自我介绍。
聊项目。
Android:
1、项目用到了MVP模式,讲一讲给你带来了什么,有什么好处。
1)结构分层,数据、视图解耦2)代码更加清晰,逻辑更加鲜明
3)更加利于扩展,便于维护
2、MVP 中P层过大的情况如何解决?
为什么p层会过大,主要是由于view层接口行为过多时会导致定义很多方法,导致p层代码量过大。关于如何解决我这里引出了MVVM模式。
3、MVVM讲一下,有什么好处?解决了MVP的什么问题?
MVVM模式相当于把P层换成了ViewModel,ViewModel主要做数据持久化的功能。在ViewModel中只要做数据相关的事。 至于View相关的问题,采用了LiveData和DataBinding来做数据视图双向绑定。
也就能够解决P层接口方法过多的问题,将视图行为接口采用数据视图双向绑定来做,减少代码量。
4、Android有什么进程间通信机制?(主要讲了Binder)
Binder机制: 在内核空间中开辟一块缓存区,将要发送的数据复制到该区域,接收方再将该数据从该空间中去除到自己的内存空间中,以此完成数据传递。
Binder本质上是一种虚拟的物理设备驱动。也就是Binder驱动、
主要有以下特点:
1)要经过两次复制,效率有限。
2)大小在发送时只有发送方知道,接收方不能够确定需要多少空间进行接受。
3)安全,用内核生成的ID来做身份鉴别。
5、讲一下Activity的生命周期。 (基本知识)
6、讲一下A跳转到B的生命周期。 (基本知识)
7、为什么在生命周期中要这样子定义?
个人思考:
每个生命周期活动的执行都标记着一个Activity的状态变化,我们要针对这些状态变化来做出相应的处理,因此设计了生命周期方法的存在。
每个生命周期活动的执行都标记着一个Activity的状态变化,我们要针对这些状态变化来做出相应的处理,因此设计了生命周期方法的存在。
8、为什么在跳转活动的生命周期中要先到pause()状态再进行切换,或者说为什么要有这么多方法?
个人思考:
在进行活动切换时,主要的目的就是要跳转的另一活动,且让另一活动变得可见可交互,因此需要将活动A的状态设置为不可点击,才能够确保用户点击事件触发的是在栈顶元素,防止出现出用户意料的情况。
要有这么多方法的愿意实质上就是对开发者针对Acitivity的多个状态变化要有针对性的做出反应,能够更高的掌握Activity变化,以其给用户带来更好的体验。
9、Activity的这么多方法,用一个接口来实现会不会更好,不选择继承activity类。
个人觉得不合适,因为Activity内部含有很多数据,只有简单的接口不能够实现Activity的功能......
10、若Activity采用一个类似代理的过程暴露出方法接口,你觉得会有什么问题?
(这个问题不知道怎么回答......)
11、讲一下Handler机制。 (以前的面经有)
12、讲一下RecycleView跟ListView。
在项目中处于练手的目的两个都用到了,主要有以下区别:
1、效率不同,ListView采用二级缓存(界面内、界面外),RecyceView采用4级缓存:页面内、页面外、用户自定义、ViewPool。
2、RecycleView的LinearManager功能更多,如横向滑动
3、RecycleView规范了ViewHolder、Adapter的使用。
Java:
1、讲一下多态。
多态是一种定义的行为在运行时才会暴露出来,且可以有多种行为表现的情况。
多态主要有三个要求:父子类继承关系、重写、向上转型。
多态的优点是:程序更加灵活,增加程序扩展性,减低程序的耦合性。
2、抽象类跟接口简单介绍一下。
这里简单讲了一下抽象类跟接口的区别:
1)抽象类可以包含普通变量、普通方法、final方法,接口变量只能是staic final,方法只能是public static。
2)实现抽象类的资源占有大于实现接口。
3)抽象类只能单基层,接口可以多继承。
3、为什么有了抽象类还要有接口,二者的应用场景?
个人理解:
1、抽象类是一个类,可以有一些基础属性,同时加上一个抽象方法,这部分让继承的类自己去扩展,体现了一种多态的思想。
2、接口本质上就是一种行为规范或者抽象约束,继承接口的类标志这具有这个接口的所有方法功能,约束了这个类的范围。
4、你认为Java出于什么方面考虑会设计接口?
出于对类的行为约束和定义。
5、你是怎么看待面向对象的?
个人理解:
万物皆对象,将外部世界的物质属性进行抽象,形成对象,在程序中运行时,每一个对象就是一个实例,执行这个实例的方法。是一种更好的行为叙述模型。可以实现程序的高内聚。
6、final关键词有什么作用?
1)作用于变量,定义时必须赋值,赋值后不能修改。
2)作用与类,类不可以被继承。
3)作用于方法,方法不可重写。
7、了解什么设计模式?(讲了项目中用到单例和建造者模式)
8、单例对象在多进程中另外的进程可访问到吗?
不可以,进程间空间隔离,不能够访问到定义在另一个进程空间的实例。
9、如何解决多进程问题单例对象的问题?
这个问题不知道怎么回答。。。。。。
操作系统:
1、讲一下进程跟线程以及他们之间的区别。
2、讲一下进程间通信方式。
代码部分:
到这里面试官说时间不多了,你写一下快排吧,简单用伪代码写一下也行。
然后讲思路,快速写完,写完之后发现有点问题,问面试官还有时间吗。
面试官说没有,准备下一轮面试吧。
一面结束。
总的来说百度的面试体验是我面过最好的了,问题也非常有水平,回答后他也会跟你进行交流,体验非常非常好!
然后开始噩梦二面......
--------------------------------------------------------------------------------------------------
百度Android 2面 40分钟:
开局简单自我介绍。面试官评价不错,经历很丰富。
操作系统:
1、介绍一下进程和线程。
2、站在CPU、外存、显示器的角度讲一下进程和线程的区别?(WTF!?这个问题把我搞傻了)
9/13复盘,不知道怎么回答,望高人指点。
3、讲一下内核态线程和用户态线程的区别以及优缺点、使用场景?(WTF,破防了,直接按照自己的理解瞎答一通.......)
二者区别:
(1)内核支持线程是OS内核可感知的,而用户级线程是OS内核不可感知的。
(2)用户级线程的创建、撤消和调度不需要OS内核的支持,是在语言(如Java)这一级处理的;而内核支持线程的创建、撤消和调度都需OS内核提供支持,而且与进程的创建、撤消和调度大体是相同的。
(3)用户级线程执行系统调用指令时将导致其所属进程被中断,而内核支持线程执行系统调用指令时,只导致该线程被中断。
(4)在只有用户级线程的系统内,CPU调度还是以进程为单位,处于运行状态的进程中的多个线程,由用户程序控制线程的轮换运行;在有内核支持线程的系统内,CPU调度则以线程为单位,由OS的线程调度程序负责线程的调度。
(5)用户级线程的程序实体是运行在用户态下的程序,而内核支持线程的程序实体则是可以运行在任何状态下的程序。 (用户线程和内核线程的区别 - 猪猪至曳 - 博客园 (cnblogs.com))
用户态线程优缺点:
优点:切换在用户态中进行,不用进行内核态切换,效率较高,且由用户进行调度,更加灵活。
缺点:不能够进行CPU间调度,因为CPU间调度需要进行内核态调动。
内核态线程优缺点:
优点:可以适应多CPU环境,windows就是用的内核态线程。
缺点:在进行线程切换时每次都要进行内核态切换,效率较低。
适用场景:
频繁涉及CPU调度时,使用内核态线程。CPU调度不频繁且有自定义线程调度需求时,建议使用用户态线程。(个人瞎说)
4、讲一下操作系统的内存分布情况?(这个问题也没明白面试官问啥)
9/13复盘不知道如何回答。
5、讲一下JVM的内存分布?以及什么是线程共享,什么是线程私有。(这里我已经神志不清了,以为问的是线程模型,然后被面试官纠正)
1、程序计数器,用来记录线程此次执行的指令,当需要执行跳转、循环等操作时,将该值设置为下一个指令。 (线程私有)
2、虚拟机栈:用来存储方法运行时的一些局部变量、操作数、方法出口等。 (线程私有)
3、本地方法栈:用于JNI方法的栈,作用与2点相同。 (线程私有)
4、堆区:存放所有对象的区域。 (线程共有)
5、方法区:存储已被虚拟机加载的类型信息、常量、静态变量、即时编译器编译后的代码缓存等数据。 (线程共有)
6、使用堆区和栈区的时候有什么注意事项?(二度破防)
关于堆区的使用只想到了是不是要注意OOM问题?
关于使用方法区的注意事项想不到。
Android:
1、讲一下Handler机制。
2、讲一下MQ在放任务的时候是按照什么顺序来的,如何进行的。(按照时间,链表插入)
3、有多少种类型的任务会放到MQ当中?(没听说过,这里是噩梦的开始)
启动Activity、点击、绘制、测量等等事件都是由Handler来进行传递。
4、给你点提示,例如很多点击事件、数据处理事件都会放到MQ当中去处理,那么问题来了,为什么Android要这样子设计?(三度破防)
1、对于很多事件,一般会在控件中去执行,但是遍历所有的控件是不现实的。
2、将事件放在MessageQueue中,再由对应的应用来将其取走,实现了事件由控件间传输转为在应用间传输。
3、将事件的处理由控件级上升到应用级。
5、你认为这样子设计有什么问题?你会如何改进?
这个问题不知道怎么回答。
6、你认为为什么Looper会设置死循环?(这里我说是为了更好的、更快的处理任务,面试官说不对)
1、为了更好的、更快的处理任务。
2、保持Looper线程始终忙碌,不会出现空闲后被回收的情况。(这个应该才是面试官想要的答案)
聊到这里心态基本崩了,后面问了啥也忘记了,大概就这么多。
反问环节问我有什么想问的吗,回答约没有了,此时脑子已经糊了。
最后,面试官说待会通知你,我这里的面试就结束了。
这里心里觉得不可能过了,瘫坐在凳子上,这次面试的问题真的是把我搞傻了。
结果过了五分钟,提示上线三面......
--------------------------------------------------------------------------------------------------
百度Android 3面 45分钟:
第一次遇到女的技术面试官。
1、自我介绍。
2、聊实习。
3、讲项目,讲了项目中遇到的最大问题、做的最好的是什么,都是基本问题了。
4、你是二本是吧?我怀疑你能力不大行,你讲一下有什么能够让我觉得你可以的吧。(?)
5、你在学校成绩排名怎么样?(一般般)
6、讲一下你博客写的比较好的部分或者文章是什么。(然后就挑着博客问)
7、分组交换跟报文交换有什么区别?
8、DNS域名访问全过程?
9、智力题,9个物体有一个重量不同,如何用三次天平秤出来哪个有问题?(最少就想到4次,百度也没找到3次的)
10、你在腾讯实习中有遇到跟同事之间不愉快的事吗?
11、在学校中有加入什么团体吗?
12、在团体中你觉得什么做的比较好
13、在团体中遇到最大的问题是什么?如何解决的?
14、未来有什么职业规划?
15、平时有什么生活习惯?
16、考虑在哪个城市工作?
17、考虑iOS吗?(不考虑)
代码:
二叉树的前序遍历,递归秒了,但是说用迭代能不能做,简单讲了思路。
反问环节:
Q:有什么可以改进的吗?
A:整体还好,感觉你的综合素质挺高的。
Q:二面面试官问的很有意思,他对我的面评是怎么样的?
A:挺好的
Q:结果多久出来?
A:通过的话会有HR联系你,应该挺快的。
总的来说,问了等于没问。
结束。
-----------------------------------------------------------------------------------------------------------------------------------------------------------
小结:
1、百度整体面试水平感觉非常高,问的问题在八股文的基础上进行延展,很有意思,面试官也会跟你说答案大概是什么,往什么思路去考虑,整体体验非常好。
2、二面的那些问题真的令我心态崩了,问的非常难回答,也可能是我水平太次了。
3、进入百度大池子了,我这二本本科学历估计够呛,但是还是希望能够收到百度OC吧,在此许个愿。