设计模式:
在自己的项目中一定要多总结和使用设计模式,面试官问你使用过什么设计模式的时候,如果能回答出比如状态模式、责任链、装饰等等,肯定会加分不少。如果只是回答单例和建造者模式,那就会逊色多了。这部分推荐看《研磨设计模式》。
开源项目:
这个也是必问的环节之一,建议从自己项目使用的开源项目入手,跟着代码,画一遍流程图和架构图,仔细体会这里面设计的优点和缺点。
比如OkHttp、LeakCanery等等,这些都可以。开源项目根据面试官的个人经验不同,问的深入程度也不一样,这时候就需要你个人的一些引导技巧,比如面试官可能不是很熟悉这个框架,这时候你能主动表达出这里面设计的一些细节,也能给面试官留下不错的印象。切忌在简历上写只是用过但是没看过源码的框架。
上图是我自己整理的一些资料,有需要的朋友可以私信我【资料】领取
重点项目经历
小厂的项目往往追求业务快速迭代上线,相对比较能容忍一些技术难点,但是这些技术难点往往是能体现一个人技术能力的。所以你如果在小厂,就不能过分陷入到业务中,必须跳出来找一些有亮点的技术点,做好做精。这些技术点才是一个程序员安身立命的本钱,否则公司业务陷入困境了,你的价值也就不复存在了。在如何准备面试中项目这部分,小编有几点心得:
分成三部分:
- 为什么要做这个点,
- 考虑了什么因素并且是如何做的,
- 取得了什么效果(比如启动速度从1000ms降到200ms,这种具体的数据)
可以把几个小点串起来,这样可以显得更系统和全面一些,比如代码优化和性能优化结合在一起讲。
小厂的一些优化点往往只能做性价比最高的一部分,这时候还可以讲一下业界还有哪些更优的方案
最好再准备一下“如果你没有离职项目中还有有什么不足和可以优化的地方?”(笔者面试中碰到过几次这样的问题)
**小厂跳大厂,技术基础可以准备得很充分,但是项目绝对是一个弱项。**大厂一个App可能就有几十上百人在做,小厂很多所谓的优化在大厂的面试官眼中可能都是他们很早就做过了,这时候项目本身做了哪些东西并不是太重要,需要着重体现你解决问题的思路以及你是一个有追求的程序员,至少你要能做到业界的平均水平,这样才能有机会通过面试。
技术以外的东西
大厂面试中技术以外的部分也是非常重要的一部分,这部分大多是一些软技能:
自我驱动和追求
这部分主要是在平时工作中的一些自我驱动学习和自主追求一些技术能力,而不仅仅是完成需求就可以了,这样才能体现出你个人的成长性和潜力。
沟通和协作
这部分会评估你未来在团队的融入程度以及跟团队跨团队协作和沟通的能力。比如你在工作中是否能正确看待和解决一些跨部门沟通的问题。
我的面经总结
主要分为四个方面:
Android
- Android各个版本的特性(例如6.0,动态权限)
- ANR的原因
- Android中进程间通信的方式和对比
- AsyncTask的实现原理及优缺点
- Handler机制
- 自定义view三部曲,流程(或者实际场景题,例如实现一个表盘,怎么做)
- FrameWork层次结构
- Activity生命周期(A跳转到B,A和B中生命周期的执行顺序)
- Dvlik、ART、JVM三种虚拟机的区别
- 能不能在非UI线程更新UI
- Service和IntentService的区别
- Thread和HandlerThread的区别
- Touch事件分发机制
- 怎么知道一个Activity是否发生了泄露
- 从点击一个APP图标开始发生了什么
- Activity启动流程(源码看一遍,能大致讲出来就行)
- Activity启动模式(四种)
- Intent启动Activity的方式
- onStart和onResume的区别
- LruCache以及实现原理
- Android中的MVC、MVP、MVVM的区别和联系
- Parcelable和Serializable的区别
- Service生命周期
- Service的启动方式及区别
- Binder机制
- onSaveInstanceState和onRestoreInstanceState的调用时机(需要理解,一般会出个场景让你判断)
- onNewIntent的调用时机(同上)
- Android中的性能优化和内存优化
- RxJava说一下(常用操作符,背压,线程切换原理,实际应用)
- RxAndroid说一下
- EventBus原理
- Volley原理
- OkHttp原理
- Retrofit原理
- RxJava和Retrofit结合
- Dagger2原理
- 组件化介绍一下(为什么要有组件化,怎么解决合并冲突问题)
- 快应用介绍一下
- 屏幕适配的常用方法
- Service、进程保活
- Glide原理
- AsyncTask原理
- SurfaceView和普通View的区别
- 依赖注入框架的实现原理
- Git项目管理
- 什么是三级缓存
Java
- 常用的设计模式(掌握常见的大约10种就Ok)
- ThreadLoal的作用及原理
- 线程的实现方式和实现原理
- 线程的状态,怎么创建线程,线程状态之间的转化(例如什么情况下线程会由运行变为阻塞)
- 进程的状态
- transient关键字的作用
- sleep()和wait()的区别
- hashcode()方法的作用
- ==和equals()方法区别(为什么重写了equals()方法还要重写hashcode方法)
- Java的三大特性
- 接口和抽象类的区别
- 进程和线程的区别
- 线程池各参数的含义,以及四种常用线程池的应用场景
- 阻塞队列的特点和原理和应用场景
- yield()方法的作用
- 多线程锁的类型,ReentrantLock,Lock,synchrnoized关键字等
- volatile关键字的作用(在单例中的作用)
- 闭包的概念
- 泛型(什么是类型擦除,为什么要有泛型)
- 锁优化方式(自旋锁、自适应自旋、锁消除、锁粗化、偏向锁)
- 类执行顺序
- StringBuffer和StringBuilder的区别
- HashMap的实现原理(最好是1.8之前和1.8之后都要知道)
- ConcurrentHashMap的实现原理(同1.8之前和之后都要知道)
- ArrayList和LinkedList的区别
- Java内存区域(堆区和栈区的区别,什么是运行时常量池)
- 装箱和拆箱
- OOM异常
- GC机制(GC区域,如何判断一个对象是否可以回收,GC算法,GC策略)
- 类加载机制(类加载过程双亲委派模型)
- Java内存模型(主内存与工作内存)
- 原子性(AtomicInteger原理)、可见性(volatile关键字)、有序性,如何保证
- 先行发生原则(happens-before原则)
- 线程安全的实现方法
- 锁的类型(悲观锁,乐观锁CAS算法,公平锁,非公平锁等怎么实现)
- StringBuffer和StringBuilder区别
- 注解(自定义注解)
- 四种引用的概念和区别
计算机网络
- HTTP协议(头结构,几种请求方法,缓存机制,各版本的区别)
- HTTPS协议,和HTTP协议的区别,密钥协商的过程,SSL机制
- 对称加密和非对称加密
- TCP和UDP的区别
- TCP的三次握手、四次挥手(包括状态码,以及四次挥手后为什么要等待2*TIME_WAIT)
- TCP拥塞控制机制
- TCP滑动窗口机制
- TCP超时重传机制
- DNS协议
- 五层网络模型(物理层,数据链路层,网络层,传输层,应用层)
- IP头部
- 在浏览器地址输入一个网址,发生了什么
数据结构及算法
- 链表(单向链表,双向链表)
- 数组(旋转数组)
- 队列(双端队列,阻塞队列)
- 栈
- 堆(大根堆、小根堆)
- 二叉树(完全二叉树、满二叉树、二叉排序树、平衡二叉树,红黑树)(深度遍历,层序遍历)
- 图(重点掌握图的深度优先遍历和广度优先遍历)
- 七大排序算法(冒泡,选择,插入,归并排序,快速排序,堆排序,希尔排序)
- 剑指offer上的算法题(能够对照目录,一看题目,能有思路,就ok)
- 二分查找
- 两个栈实现一个队列,两个队列实现一个栈
- 海量数据排序
- topK问题,有1千万个数,怎么快速找出最大的100个
- 合并两个有序数组,合并两个有序链表
- 杨氏矩阵(横向递增,纵向递增)中如何找到指定的数字
- 翻转一句话,例如I am 3 years old,翻转后,old years 3 am I
- 有10亿条数据,现在只有200M内存,怎么找出这10亿条数据中出现次数最多的100条数据
结语
总的来说,在这段时间中,让我深有体会的主要有两个点,一个是,早做准备比什么都重要,成功和机遇总是会眷顾有准备的人,运气在这中间固然会占有一些比重,但是仅凭运气,是远远不够的;第二个,在面试中,一个人有没有自信,完全可以判若两人,同时也会很大程度上影响最终结果,自信,真的是一种很优秀的品质,这种品质会让你整个人散发无穷的个人魅力。
最后相信自己,没有做不到的,只有想不到的!
再说一些心里话,真心的希望这篇文章能够帮助你们收获满意的offer
另外我自己的Android 学习资料,面试文档,学习视频,都可以分享给大家,有兴趣的伙伴们可以私信我【资料】或者【点这里】免费领取
如果这篇文章对大家有帮助的话请点赞、关注、转发 谢谢!
。
最后相信自己,没有做不到的,只有想不到的!
再说一些心里话,真心的希望这篇文章能够帮助你们收获满意的offer
另外我自己的Android 学习资料,面试文档,学习视频,都可以分享给大家,有兴趣的伙伴们可以私信我【资料】或者【点这里】免费领取
如果这篇文章对大家有帮助的话请点赞、关注、转发 谢谢!