2019.03.13日收到小米的Android面试邀请,本来是要去公司面试的,但是本人着实懒,,,
赖到中午1点半了才想起来有面试。。只好沟通一下远程面试了。。
下午三点,接电话的是一个声音温柔的小哥哥,可能是因为我的微信性别是女吧。。。
面试官有了两个人。第一个面了一个小时,应该是过了;第二个面了半小时,应该是挂了。。。
第一个面试官:
面试官:项目中你使用了360开源的插件框架DroidPlugin,那你说说DroidPlugin的原理。
我:通过动态代理的方式,代理Android的四大组件,动态代理的方式是通过Java反射机制实现的
面试官:不是吧,没有Java反射,是通过Proxy类。。。
我:我之前查了文档,动态代理就是有Java反射。。。
面试官:*……%¥&&下一个问题。。。面试官:你说说Android有哪几种布局方式。
我:有4种布局方式:LinearLayout, RelativeLayout, FrameLayout, AbsLayout. 常用的是线性布局和相对布局以及帧布局。
面试官:那你知道一种 约。。。约束布局吗
我:ConstraintLayout,我知道,用过,和FrameLayout差不多。面试官:你说说
标签是干啥的
我:什么标签???
面试官:m!e!r!g!e! merge标签
我:奥奥。。。不知道干啥的,但是我知道ViewStub标签和include标签,include标签是用于复用一个布局的,ViewStub是用于惰性加载的。
面试官:那你说说ViewStub标签是怎样惰性加载的
我:就是在运行中需要再加载布局才能真正加载到窗口中。
面试官:你说说ViewStub的使用场景是什么。
我:。。。(想了一会儿~)对不起,这个问题答不上来。。。
面试官:ViewStub一般是与用户状态有关。
我:啊???
面试官:就是你一个用户有多个状态,你只需要显示某一种状态,这时候就用ViewStub.
我:学到了。。。
面试官:merge标签的应用场景是用在自定义View,作为View布局的根元素,可以减少绘制层次,比如你根元素使用RelativeLayout,
父布局也使用RelativeLayout,那么这个RelativeLayout就可以省略。
我:奥喔!!!对对对!就是这个作用(o_o!!)面试官:下面咱们聊聊Java方面的知识吧。你知道多线程吗,怎么同步
我:知道知道。一般使用synchronized进行同步,还有ReentrentLock也可以。
面试官:那synchronized可以放在哪些位置
我:可以放在方法名前面,可以放在代码块中。
面试官:那这两个位置有什么区别
我:放在代码块前一般是同步的this,,,但是在方法名前面的没有显示说明,emmmmmm,我猜也是同步的this,这两种方式没有什么区别。。。
面试官:那你知道synchronized同步的是什么吗
我:(什么鬼。。。)我猜。。应该是类的对象吧。。对,就是类的对象(我真机智O_o*)
面试官:(诡诘一笑) 同步是类的对象哦。。那snychronized static呢?同步的是什么呢,static类型就没有类的实例了啊。
我:(我去。。。高兴早了。。。)对不起,这个问题答不上来。。。(哭唧唧!!_!!)
面试官:行8,后面你可以去查一查。那ReentrentLock呢?中文意思是
我:翻译过来是 可重入锁。
面试官:为什么叫可重入,原理是什么呢
我:这个锁一般是在方法递归的时候使用,在锁的内部有一个计数器,方法每调用一次自身就会增加一,这样方法不用重复获取锁。
面试官:那synchronized可不可以呢
我:不可以吧。。synchronized的递归使用可能会引起死锁。。。(我也不知道。。。乱说的)
面试官:emmmmm(意味深长表情.jpg) 那咱们使用ReentrentLock的时候,构造方法有一个布尔值参数,这个参数是干啥用的
我:这个。。。我不知道,我只是学过,没有用过这个锁。。。
面试官:行8。。。面试官:你知道CAS吗?
我:知道知道,上学期刚学的。。。(面试官:呵呵,那你就说说吧) CAS是指compareAndSet,有两个参数,一个是expectValue,
一个是updateValue。在方法内部存有一个值value,如果value和expectValue相同,就把updateValue设置给value,返回true。否则返回false.
面试官:嗯。那你知道ABA问题吗?
我:知道知道!就是我举个具体的例子,有一个共享链表,线程A要取A,B线程取走了AB,又把A放回链表中,这时线程A使用CAS无法区别这两个A。
这就是ABA问题。解决的办法是使用timeStamp
面试官:emmmm 行面试官:下面来看一道算法题。我有一个二叉树,要实现深度遍历,从叶子节点打印到根节点,请你描述一下过程。
我:emmm 我需要一个队列和一个栈。。。队列用于实现按层遍历,栈用于倒序输出。
面试官:怎么会需要队列呢??就直接放在栈里面不可以吗!!!(过程没听懂。。。但是。。感觉不靠谱)
我:不行吧。。我觉得还是要一个队列才能实现按层遍历。。
面试官:不用!
好了 一个小时了,先这样吧。。补充:还问了Activity的4种启动模式。SingleTop和SingleTask的区别。Handler机制。
第二个面试官:
给人的感觉好严肃,我都笑了好几下他才呵呵了一下。。略表尊敬。。。
问的东西:- App点了home键会走哪些流程,然后从桌面返回会走哪些流程。
onPause->onStop.(一定不走onDestory). onRestart->onStart->onResume
如何保存这些数据。
在onPause前调用onSaveInstanceState保存临时数据,在onStart后调用onRestoreInstanceState重现数据。 - Broadcast有几种注册方式,静态方式和动态方式有哪些不同。
在AndroidManifest中进行注册后,不管改应用程序是否处于活动状态,都会进行监听,比如某个程序时监听 内存的使用情况的,当在手机上安装好后,不管改应用程序是处于什么状态,都会执行改监听方法中的内容。
在代码中进行注册后,当应用程序关闭后,就不再进行监听。我们读知道,应用程序是否省电,决定了该应用程序的受欢迎程度,所以,对于那些没必要在程序关闭后仍然进行监听的Receiver,在代码中进行注册,无疑是一个明智的选择 - View的事件分发机制
不了解。 - 自定义View流程。
在onMeasure中计算View的大小,在onDraw中绘制View的具体内容。
需要自定义一个ImageView, 宽高比3:2。
重写onMeasure方法,将widthSpec的specMode设为0(match_parent)模式,将heightSpec的value设置为width的2/3,将specMode设置为exactly模式。 - 4种动画类型:帧动画,补间动画,属性动画,Object动画
java中equal和==的区别
不了解。
基本数据类型(也称原始数据类型):byte,short,char,int,long,float,double,boolean。他们之间的比较,应用双等号(==),比较的是他们的值。
引用数据类型:当他们用(==)进行比较的时候,比较的是他们在内存中的存放地址(确切的说,是堆内存地址)。
equal对于引用类型:默认情况下,比较的是地址值。java中3大关键字。
final,const,static。
final关键字的作用。
对于变量,只能被赋值一次,不能被修改。对于方法,不能被重写。对于类,不能被继承。重载与重写的区别
重载就是方法的名称相同,但是返回值类型或者参数类型需要不一样。
重写就是重写父类方法,返回值和参数类型相同。
面向对象的3个特征。
封装,继承,多态。List优化。
使用ViewHolder实现优化。。。
- App点了home键会走哪些流程,然后从桌面返回会走哪些流程。
面试官:行吧。。。
然后聊了些有的没的,说我是全面型人才???
我觉得我是每样都没弄好:) emmmmmm,这大概是最委婉的拒绝方式了吧。。
可能整个面试下来,面试官觉得,怎么会有这么笨的人。。。
总之,还要不断提高自己,现在一聊到算法就有点虚,要多多练习。