如今在Android 市场找一份适合自己的工作是真的难,要么就是薪水给的很低,要么就是高薪水的Offer拿不下,有不少Android 开发都在抱怨当初就不应该选Android 开发这条路!
近期听到不少粉丝和身边的朋友都在抱怨工作难找,一天投个几十份,而收到面试通知的就那么三四家,而自己中意公司的却没有给出回应,唉……真难啊!!!
为了帮助给大家鼓舞士气,从几个粉丝手中要到了他们近期面试成功的一些经验分享,中间有基础点的面试也有难点的面试,大家可以进行参考一下:
一面
二面
三面
一面
1.自我介绍
2.Android一些优化方案
3.什么是过渡绘制,如何防止过渡绘制
4.事件分发机制
5.ListView的优化
6.Binder机制
7.在多进程中,Application会启动几次
8.单例模式,双锁原理,volatile原理,静态内部类实9.现单例的原理。
二面
1.自我介绍
2.询问Android的相关知识问的也不多,大多是放在项目上的东西。
3.Java多线程,synchronized
4.聊项目,都具体做了什么。
5.Binder机制
三面
主要了解一些个人的情况,以及一些项目,最后问了期望的薪资,以及对公司的看法和自己个人的规划
一面(1h左右)
简单讲讲你项目的整个设计过程
你提到项目中用的是 MVVM 架构,讲讲你对 MVVM 的认识?
1.MVVM 的优点有什么呢?
2.MVP 中 Model、View 和 Presenter 的持有关系是怎么样的?
3.MVVM 中的持有关系呢?
4.MVVM 中各个层在 Android 开发中的对应关系?
5.你的 MVVM 用到了 Jetpack 里的 ViewModel,那么它是如何保持数据的呢?
6.ViewModel 是怎么做到在 Activity 销毁重建新实例之后还能保持不变的呢?
你有提到说用的 Kotlin,那讲讲 Kotlin 用起来相比 Java 的好处?
1.如果用 Kotlin 去调用一个具有返回值的 Java 函数,那么这个返回值是可空的还是非空的呢?
2.Kotlin 中的可见性和 Java 是不一样的,分别讲讲?
3.你说你用到了协程,讲讲你对于协程的认识?你提到了协程分为有栈和无栈两种。它们的区别是?这个“栈”里都保存了什么信息?Kotlin 的协程是无栈的,那这些信息是怎么保存的?协程该怎么取消呢?取消协程之后,里面的工作会立刻停止吗?不会的话,该怎么停止呢?调用了 cancel() 之后协程的状态变化?如果子协程中没有通过判断协程状态来决定是否终止工作,那么取消父协程之后会是怎样的?协程会不会和线程一样有共享变量冲突的问题呢?
4.Kotlin 中有一个 inline 关键字,讲讲你的了解?除了通过内联函数减少函数调用的开销,还有什么用途吗?如果现在有一个高阶函数被 inline 修饰,我不想让它的参数被内联,该怎么办呢?刚开始的时候这个问题没太听懂,所以就答了不知道。一面结束之后翻书才看到 noinline 关键字。
5.Kotlin 是可以跨平台编译的,讲讲你的了解?你刚才提到的编译到“原生平台”,指的是什么?现在如果让你用 Kotlin 写一个跨平台的项目,你该怎么做?
浏览器里从输入一个网址,到最终看见网页,发生了什么?
1.HTTP 是应用层协议,讲讲是如何建立的?你说底层是 TCP,那讲讲 TCP 的三次握手?
2.如果现在要使用 HTTPS,连接的建立会发生什么变化呢?
3.客户端是如何根据 IP 地址找到服务器对应的主机的呢?
二面(1h)
项目介绍。用到了什么技术栈?
1.ViewModel 的作用是什么?你在 Fragment 之间传递数据的时候是怎么做的?为什么不用一个全局的静态变量呢?
2.你有用 LiveData 自己封装了一个事件总线,讲一讲实现?
3.对 Retrofit 的基本结构或者源代码了解吗?
4.Retrofit 有一个动态代理的过程,有听说过吗?
Kotlin 和 Java 都是在做这个 Android 项目中学习的吗?
在 Kotlin 和 Java 中,实例的初始化顺序(成员变量、静态变量、构造函数等)分别是怎样的?
Kotlin 的作用域函数(let、apply 等)有了解过吗?
你是怎么理解的?具体来说它们有些是带 Receiver 的、有些是带参数的,你在使用过程中是怎么选择的呢?
OOP 中的设计模式有了解过吗?
1.Java 中的单例模式分为那些呢?
2.Kotlin 中的 object 相当于 Java 中的哪一种单例模式?饿汉式是怎么做到线程安全的?类加载器又是在什么时候去加载这个类呢?解释一下饿汉式中存在的性能问题?在 Kotlin 中如何实现懒汉式单例?
4.Java 中 DCL 单例模式中双重校验的意义?
Jetpack 的其他组件有了解过吗?
1.Room 使用的基本流程了解吗?
2.SQLite 平常你是怎么用的呢?
三面(40 min)
最开始没想起来,后来面试官提到 Flutter 才想起来是新出的一个声明式 UI 框架。
Flutter 有了解过吗?
synchronized 关键字修饰静态方法和非静态方法的区别?
一个类中有一个静态方法 A 和非静态方法 B,都被 synchronized 修饰。两个线程分别去调用同一个实例的方法 A 和方法 B,会产生竞争吗?
volatile 关键字的作用?
解释一下“立即对所有线程可见”和“禁止指令重排”?
Java 中的四种引用类型有了解过吗?分别有什么区别呢?
GC 机制有了解过吗,比如算法之类的?
一个 View 要渲染出来,需要经过哪几个步骤呢?
1.这些步骤各自对应了一个回调方法,对 View 的什么操作会触发对这些回调方法的调用呢?或者说,不同的操作会触发不同的调用吗,比如有的调用,有的不调用?
2.除了在 Activity 创建的时候,后续对 View 的哪些操作会触发这些回调方法呢?(这里确实没复习到,现场通过 TextView 举例结合了这三个阶段的回调方法名开始猜)
3.如果说 TextView 大小固定呢?
除了绘制,View 还有一些事件的传递机制,有了解吗?过程中的几个关键过程回调是哪几个呢?
有听说过“过度绘制”吗?
这个没答上来,然后面试官很耐心地解释了这个概念,实际上就是两个 View 叠在一起,下层被上层挡住的部分是看不见的,但还是会进行绘制。
HR 面(27 min)
大家可以先参考一下上面面试中的一些题,当做是自己的一场面试,检测一下自己技术能力,从中发现不足急死弥补,学习是大家自己的事情我只是给出一些学习的方式和建议!
最后综合了我与粉丝小伙伴们面试与网上收集的一些面试题,整理了下面这《Android 进阶面试集锦》参考。有需要的可以 直接点击此处↓↓↓ 进行参考学习!
通过一些真刀真枪地实战,可以帮助你迅速地调整面试的状态,记住,你的最终目标是你心仪的公司,不要被中间的一两个失利的战斗影响到自己,找出问题所在,为下一个面试做好准备。