前言
从毕业到现在面试也就那么几家公司,单前几次都比较顺利,在面到第三家时都给到了我offer!前面两次找工作,没考虑到以后需要什么,自己的对未来的规划是什么,只要有份工作,工资符合自己的要求就行!所以在智联招聘上选好工资范围,就一顿海投,做等面试电话!
做了两年快三年的Android开发,工作的任务也就是一些界面的编写,RecyclerView的简单使用,网络框架也是别人封装好的直接用,再就是集成些第三方的分享、支付什么的!技术上的提升可以说根本没有,和工作一年左右的人,比起来就多几个项目优势!所以这次出来找工作还期望15K,说起来心里很慌!有哪些原因呢?
1、小公司要求不高,自己也抱着只要能做出功能的态度
2、对行业趋势把握不准,没有未来规划(所谓混吃等死)
3、对自己的工作不感兴趣,上班有空闲时间也不会去深入学习
再来说说这次找工作面试的一些经历和感想!这次面试大大小小面试了十多家!依我自己在简历上写的几个商城类APP的工作经验,在智联和拉钩上也只有小公司能叫我去面试!(所以说技术深度很重要)
前面两次的由于面试没怎么准备,直接over肯定是没问题的!第一家一个小姐姐把我问得n脸懵逼(一个屌丝程序猴和妹子聊天就紧张,心跳加速,口干舌燥,说话结巴)!她首先让我自我介绍一下,可脑袋一下像短路了一样!就说:“你知道的程序员表达能力差,嗯。。。嗯。。。你看简历吧!”她直接一脸无语!
新一轮面试的准备
正是因为上一次面试的悲惨经历,因为感觉自己突然啥都不会了,迅速镇定下来,去网上找了一下Android的面试题,但是发现都只有提问了什么并没有对所提问题的解答,那只能自力更生,像做试卷一样,一遍总结一遍温顾。
其实大多都是平时开发中用到的,只是我们没有总结过,被问起来的时候回答的难免会有点捉襟见肘,不能回答的很全面.下面为我个人总(bai)结(du)的,希望对你能有所帮助,但毕竟能力有限,有写的不对的地方,还望轻喷.虽然喷我我也不会改的.
因为本文篇幅较长建议收藏,在用到时候找出来看一眼.有一些知识点可能没涉及到,以后会加以补足.因为面试无非是考察你对技术的理解和总结,所以本篇的每个点总结的比较精简,只是让你大概的说出来,有的部分是需要能够画出原理图并进行解释说明,这个要在工作中多积累.
常考知识点
1、Java
- 讲下equals和hashcode,他们为何必须一起重写?hashcode方法重写规则。
- HashMap相关。
①HashMap添加元素的过程,hash方法细节;扩容的触发条件、扩容过程中是数据是整体复制么?链表转红黑树的阈值为何是8,红黑树转链表的阈值为何是6,为何不上同一个阈值?链表为何要转红黑树?红黑树有何特性?hashmap为何如此设计?
②对应的并发容器。HashTable以及ConcurrentHashMap实现细节,优劣势; 如何使现有的HashMap线程安全?(Collections#synchronizedMap)
- 运行时数据区域分区,哪些线程私有,哪些线程共享。栈帧的数据结构。方法区存放哪些数据。
- 简单描述一下 Person person = new Person() 对象实例化过程。最好有类加载过程。
- GCRoot的类型,举例说明。
Activity中的匿名Handler导致的内存泄漏,最终的引用链root要分析到Thread#threadLocals上
- LRU的实现。让你自己实现一个,你会怎么做。
- 线程的几种状态。
- 线程池。
①7个参数。
②线程池中的任务可以实现按照优先级执行么,如何实现?(优先级队列)
③线程池的设计用到了那种设计思想?(生产者消费者模型)
④何为阻塞队列?
⑤你是如何配置线程池的?核心线程数你一般是怎么配置的?
- T1、T2、T3三个线程,如何保证它们顺序执行?也就是异步转同步的方式。
①Thread#join
②等待多线程完成的CountDownLatch
③FutureTask
④Executors#newSingleThreadExecutor
⑤wait/notify
- Java中 wait和sleep方法的不同?(wait释放锁,sleep不会释放锁)
- 线程安全相关。
- 锁。synchronized、volatile、Lock。锁的几种状态。CAS原理。
①为什么会有线程安全?
②Java中如何保证线程安全?
③synchronized和Lock的使用、区别及底层实现;volatile的作用和使用方式;常见的原子类。
④synchronized中的类锁和对象锁互斥么?
- 讲下Java的双亲委派。
- 泛型。
①泛型擦除的原因和效果,擦除的时机。
②为何会有协变和逆变
③通配符。
④PECS
- 反射。
- 注解。
①Source和Class、Runtime注解的区别
②注解如何使用
- 方法内部的匿名内部类使用方法的局部变量时,为何要使用final修饰?
2、Android
- 启动模式,以及常见用法。
①举例说明
②taskAffinity,allowTaskReparting的用法。
③有没有遇到哪些诡异的现象?如何解决的?
- Activity生命周期。
①常见生命周期方法
②A启动B的,然后按back键,执行了哪些方法?如果是A启动B的,然后按home键呢?
③onSaveInstance方法调用时机。
- Bitmap内存优化。
①Bitmap内存如何计算?如何在不改变图片质量的情况下优化?Bitmap内存复用(Options.inBitmap)
②超大图加载(BitmapRegionDecoder)
③跨进程传递大图(Bundle#putBinder)
- xhdpi的图片分别显示到hdpi和xxhdpi的手机上,显示的大小和内存是怎样的?
- 资源文件加载规则。比如说图片存放在drawable-hdpi和drawable-xxhdpi下,xhdpi的手机会加载哪张?如果删除掉drawable-xxhdpi下的图片呢?
- Android的进程间通信方式。
①Android为何要自己搞一个binder,使用linux原有的通信方式不行么?(安全、性能好,方便易用)
②binder通信的内存大小限制。(1M和128k)
③binder的架构(Application、ServiceManager、系统Service、binder驱动),以获取系统服务的过程举例分析。
④Application#onCreate里面可以使用binder服务么(可以)?Application的binder机制是何时启动的(zygote在fork好应用进程后,会给应用启动binder机制)?binder机制启动的几个关键步骤。
⑤binder线程池默认最大数量(15)?
⑥binder和AIDL。
⑦oneway。
- 谈谈你对Android中Context的理解?四大组件里面的Context都来源于哪里。
- Application启动流程。
①AMS是如何确认Application启动完成的?关键条件是什么(zygote返给AMS的pid;应用的ActivityThread#main方法中会向AMS上报Application的binder对象)?
②Application#constructor、Application#onCreate、Application#attach他们的执行顺序(132)。Activity和Service呢?
- startActivity的具体过程。
- Activity#setContentView的具体过程。
①PhoneWindow是何时创建的,它的作用是什么?
②setContentView中传递的资源文件是如何变成View对象的?
③布局文件对应的View对象是添加到哪里的?
④Activity的布局是何时显示出来的?
⑤ViewRootImpl是何时初始化的?它的作用是什么?
⑥Choreography了解么?作用是什么?
- Surface的作用是什么?它是何时初始化的?View绘制的数据是如何显示到屏幕上的?
- Handler机制:
①应用层,消息的发送、接收、获取和处理;消息是如何存储的?延时消息一定准时么?是如何保证延时时间的?Handler#dispatchMessage细节,如何使用?
②Handler的Framework层。Looper#loop方法为何不会导致ANR?nativePollOnce细节。eventfd和epoll机制了解么?
③IdleHandler了解么?合适调用?如何使用?靠谱么?
④handler里面消息有几种?普通消息、同步消息、消息屏障。如何使用?如何区分普通消息和异步消息?
⑤如何实现给Handler发送一个Runnable,又不通过Handler#post(Runnable run)这个API?(Message#obj属性,或者通过反射设置Message#callback属性)
⑥Message#obtain实现细节了解么?为何要池化?最大限制容量是多少?
- ThreadLocalMap的实现。
- View绘制流程
①onMeasure、onLayout、onDraw
②MeasureSpec为何如此设计?
③子View的LayoutParams来源。ViewGroup#addView(view)这种添加view的方式,没有给子View设置LayoutParams,那么LayoutParams是谁设置的?
④onMeasure和onLayout为何会执行两次或多次?
⑤View#draw方法细节。
⑥View绘制这一块遇到过什么问题么?如何解决的。
- 自定义View有哪几种方式?注意事项。你对自定义属性如何理解?
- 事件分发。滑动冲突如何解决,具体在哪个方法里面解决?如何判断滑动方向?
- 动画
- Apk打包流程。R文件最终会生成什么文件?aapt的作用是什么?
- LocalBroadcastReceiver,为何比BroadCastReceiver速度快,LocalBroadcastReceiver的实现。
- RecyclerView的缓存。RecyclerView的优势是哪些?都用它做过什么功能?
- 讲下leakCanary原理。为什么不用虚引用?引用队列里面存的是什么?内存数据是如何dump出来的?
- 讲下OkHttp的实现。拦截器的顺序,网络拦截器和普通拦截器有什么区别?它的线程池是怎样的?如何管理的?
- glide的三级缓存如何做的?
- rxjava的原理。rxjava的线程切换如何实现的?map和flatmap操作符区别;zip和merge操作符区别。
- ArrayMap和SparseArray的作用和实现细节。
- 组件化和模块化的区别。
- mvp、mvvm。
- jetpack组件。
- gradle中task的生命周期。
- 插件化原理。
- 热修复原理。
3、Android性能优化
- 启动速度优化。冷启动、温启动、热启动了解么。
- 内存优化
- 卡顿优化
- 网络优化
- 数据库优化
- 内存泄漏优化
- 包体积优化
4、http相关
- 描述一个完整的网络请求流程。
- TCP和UDP区别,三次握手与四次挥手的细节;为何建立链接需要三次,断开链接却需要四次。
- http和https区别。https的链接过程?
- 断线续传如何实现。大图分段上传如何实现。关键步骤
- 分段下载如何实现。
- 请求重试机制如何实现。
5、设计模式
- 你熟悉哪些设计模式?请举例说明。为何选用这个设计模式。
- 策略模式和桥接模式的区别
6、kotlin
- 说一下kotlin的优缺点。let和with的区别
- 扩展函数
- kotlin的lateinit和by lazy的区别
- 构造函数有哪几种
- 协程
7、flutter
- flutter的isolate
- flutter的优势和劣势
- flutter的channel通信方式有哪几种?
- flutter的包体积优化
- flutter中State的生命周期,didUpdateWidget方法何时调用
8、项目相关
- 选一个你最熟悉的项目讲解下。
- 讲一下你的技术栈
- 你最自豪的项目或者片段
- 你最擅长哪些部分
- 你的上份工作经历中,最大的收获是什么?
- 你的职业规划
百度面试经历分享 (已拿offer)
大多数题目都可以在上面找到答案.
电话面试题
1.ArrayList 和 Hashmap 简单说一些,区别,底层的数据结构.
2.Handler 消息机制
3.引起内存泄漏的场景
4.多线程的使用场景?
5.常用的线程池有哪几种?
6.在公司做了什么?团队规模?为什么离职?
第一轮
1.知道哪些单例模式,写一个线程安全的单例,并分析为什么是线程安全的?
2.Java中的集合有哪些?解释一下HashMap?底部的数据结构?散列表冲突的处理方法,散列表是一个什么样的数据结构?HashMap是采用什么方法处理冲突的?
3.解释一下什么是MVP架构,画出图解,一句话解释MVP和MVC的区别?
4.Handle消息机制?在使用Handler的时候要注意哪些东西,是否会引起内存泄漏?画一下Handler机制的图解?
5.是否做过性能优化?已经采取了哪些措施进行优化?
6.引起内存泄漏的原因是什么?以及你是怎么解决的?
这些问题应该都是比较基础的问题,每个开发者都应该是非常熟悉并能详细叙述的.这一轮的面试官问的技术都是平时用到的.
第二轮
1.关于并发理解多少?说几个并发的集合?
2.Handler 消息机制图解?
3.在项目中做了哪些东西?
4.画图说明View 事件传递机制?并举一个例子阐述
5.类加载机制,如何换肤,换肤插件中存在的问题?hotfix是否用过,原理是否了解?
6.说说项目中用到了哪些设计模式,说了一下策略模式和观察者模式?
7.会JS么?有Hybid开发经验么?
8.说一下快排的思想?手写代码
9.堆有哪些数据结构?
对于这轮面那是明显感觉到压力,知识的纵向了解也比较深,应该是个leader.
第三轮
1.介绍一下在项目中的角色?
2.遇到困难是怎么解决的?
3.如何与人相处,与别人意见相左的时候是怎么解决的,并举生活中的一个例子.
4.有没有压力特别大的时候?
这个应该是项目经理了,问的问题偏向于生活性格方面.
以上面试中问到的题目基本上都可以在我的GitHub里找到答案,所以做准备是很重要的,但技术是一点点积累的,就算你全会背了,面试过了,真正等到工作的时候还是会捉襟见肘的,所以踏实点吧骚年.
我的【Github】会分享一些关于Android进阶方面的知识,也会分享一下最新的面试题~
如果你熟练掌握【Github】中列出的知识点,相信将会大大增加你通过前两轮技术面试的几率!这些内容都供大家参考,互相学习。
①「Android面试真题解析大全」PDF完整高清版+②「Android面试知识体系」学习思维导图压缩包——————可以我的【Github】阅读下载,最后觉得有帮助、有需要的朋友可以点个赞
网友评论