1. 简历
首先,准备好简历,然后再过一遍面试问题。
其实,写简历时可能需要注意以下几点:
1、直接按照姓名-工作年限-应聘职位的格式填写标题。比如小明——四年工作经验——Android开发高级工程师。因为你知道,HR的屏幕恢复得很快,你必须尽快让他看到他想看到的信息。 HR一开始最关心的就是工作年限和职位。你直接用最大的字体写在标题栏上,比很多人介绍半天项目最后写出年份要好得多。
2.先写个人信息。其实个人信息栏不需要写很多东西。最重要的是您的姓名、联系信息和性别。如果学校是名校,那就写在这里。如果你本科专业是计算机科学,也可以写在这里。如果这两者都不是,最好放弃它。写在最后,因为第一个永远是你最先看到的,也是你最有竞争力和炫耀的资本。
3、有技术博客和github开源项目的一定要先写。这是一个活生生的例子。我在华为面试的时候,面试官专门看了我csdn上的博客。然后他说文笔很好,给他留下了很好的印象,所以这绝对是加分项。最好写在前面。
其实一开始我并没有怎么去温习面试题,就是简单的看了一些基础知识点。因为我总觉得读的越多越难记住,而且最重要的是你不知道面试官会问什么。与其盲目地看知识点,不如出去面试几家小公司,感受一下面试的感觉。官员会询问具体区域,然后回来仔细查看。
2. 技能储备
(一)Java 1.HashMap和Hashtable有什么区别?
你必须阅读它的源代码!看源码!看源码!如果实在受不了,可以上网看看别人的分析。以下是一些简单的总结:
1.HashMap支持null Key和null Value;哈希表不允许这样做。这是因为HashMap对null进行了特殊处理,将null的hashCode值设置为0,并将其存储在哈希表的第0个桶中。
2.HashMap不是线程安全的。 HashMap的线程安全方法是Map map = Collections.synchronziedMap(new HashMap());哈希表是线程安全的。
3、HashMap默认长度为16,扩容为原来的2倍; Hashtable的默认长度是11,扩展是2n+1。
4.HashMap继承AbstractMap; Hashtable继承Dictionary
扩展、HashMap 与 ConcurrentHashMap、HashMap 与 SparseArray、LinkedArray 与 ArrayList、ArrayList 与 Vector
2.Java垃圾回收机制
需要了解JVM、内存划分——方法区、内存堆、虚拟机栈(线程私有)、本地方法栈(线程私有)、程序计数器(线程私有)、了解回收算法——标记和清除算法、可达性分析了解算法、标记整理算法、复制算法和生成算法的优缺点。
欲了解更多详情,您可以阅读其他同学写的内容,然后点击链接打开。
3.类加载机制
这个可以结合热修复来深入理解。点击打开链接
4.线程和线程池、并发、锁等一系列问题
这可以延长。如何自己实现线程池?
5.了解HandlerThread和IntentService
6.弱引用和软引用的区别
7. int 和 Integer 有什么区别?
主要考虑价值传递和引用传递问题
8. 手写生产者/消费者模型
(二)Android 1.android启动方式
需要了解Activity栈和taskAffinity
1.Standard:启动时系统默认多一个Activity实例。
2.SingleTop:在栈顶复用。如果在栈顶,生命周期不会经过onCreate()和onStart(),而是会调用onNewIntent()。适合推送消息详情页面,比如新闻推送详情Activity;
3.SingleTask:在栈中复用。如果它存在于堆栈中,则其上的所有 Activity 都会弹出堆栈,使其位于堆栈顶部。生命周期与SingleTop相同。 app首页基本都是用这个
4.SingleInstance:这是SingleTask的增强版本。系统会为要启动的Activity打开一个单独的栈。它是该堆栈中唯一的一个。适合新开的活动和可以独立打开的应用,比如系统闹钟、微信视频聊天界面。这是真的吗?如果你知道的话,请告诉我。谢谢!
另外,SingleTask和SingleInstance似乎会影响onActivityResult的回调。具体问题大家可以自行搜索,我就不赘述了。
Intent还需要进一步了解Action、Data、Category的用法和作用,以及常用的
Intent.FLAG_ACTIVITY_SINGLE_TOP
Intent.FLAG_ACTIVITY_NEW_TASK
Intent.FLAG_ACTIVITY_CLEAR_TOP
等等,我们仔细看看源代码。
2.视图绘制流程
ViewRoot->performTraversal()->performMeasure()->performLayout()->perfromDraw()->View/ViewGroupmeasure()->View/ViewGrouponMeasure()->View/ViewGrouplayout()->View/ViewGroup onLayout()->View/ViewGroupdraw()->View/ViewGrouponDraw() 我们来看看invalidate方法。有4个参数,不带参数有什么区别? requestLayout触发measure和layout,如何实现局部重测,避免全局重测问题。
3. 事件分发机制
->dispatchTouchEvent()->onInterceptTouchEvent()->onTouchEvent()requestDisallowInterceptTouchEvent(boolean)以及onTouchEvent()、onTouchListener、onClickListener的顺序
4.消息分发机制
这个测试很常见。一定要看源码,代码不多。带着几个问题去那里:
1、为什么一个线程只有一个Looper,也只有一个MessageQueue?
2、如何获取当前线程的Looper?它是如何实现的? (了解ThreadLocal)
3.任何线程都可以实例化Handler吗?有什么限制吗?
4.Looper.loop是无限循环。如果无法获取需要处理的Message,就会阻塞。那么为什么在UI线程中不会导致ANR呢?
5.Handler.sendMessageDelayed()如何实现延迟?结合Looper.loop()循环、Message=messageQueue.next()和MessageQueue.enqueueMessage()分析。
5.AsyncTask源码分析

网上有很多利弊分析,我就不重复了。
6、如何保证Service不被杀死?如何保证进程不被杀死?
我面试的时候有3家公司问了这两个问题。
7.Binder机制,进程通信
Android使用的进程通信底层基本就是Binder、AIDL、Messager、broadcast、ContentProvider。并不是很深入的了解。至少可以写和读如何使用ADIL和如何使用Messager。另外,序列化(Parcelable 和 Serilized)需要进行比较。这方面,可以阅读任玉刚大师的《Android艺术开发探索》一书。
8、动态权限适配问题及换皮实现原理
对此,请阅读洪阳的博文。
9、SharedPreference原理,可以跨进程使用吗?如何实现?
(三)性能优化问题 1.UI优化
一个。合理选择RelativeLayout、LinearLayout、FrameLayout。 relativeLayout会导致子View调用onMeasure两次,而且当布局比较复杂时,onMeasure相对复杂且效率低下。 LinearLayout也会在weight>0的时候让子View调用两次onMeasure。 。 LinearLayout权重测量分配原理。
b.使用标签
c.要降低布局层级,可以通过移动开发者选项>GPU转场绘图查看。一般水平控制在4层以内。如果超过5层,就需要考虑是否重新布局。
d.自定义View时,重写onDraw()方法,不要在该方法中创建新对象,否则很容易触发GC,导致性能下降。
e.使用ListView时,需要复用contentView,使用Holder减少findViewById来加载View。
f.去除不需要的背景,getWindow().setBackgroundDrawable(null)
g。使用TextView的leftDrawabel/rightDrawable代替ImageView+TextView布局
2.内存优化
主要是为了避免OOM和频繁触发GC带来的性能下降。
a.Bitmap.recycle(),Cursor.close,inputStream.close()
b.加载大量Bitmap时,根据View大小加载Bitmap,合理选择inSampleSize、RGB_565编码方式;使用LruCache缓存
c.使用静态内部类+WeakReference代替内部类,如Handler、线程、AsyncTask
d.使用线程池来管理线程,避免创建新线程
e.使用单例保存Context,需要记得释放,或者使用全局上下文
f.注意释放静态集合对象
g。属性动画导致内存泄漏
h.使用webView时,需要在Activity.onDestory、webView.removeAllViews()和webView.destory()中移除并销毁
准备工作:使用LeakCanary检测内存泄漏
3.响应速度优化
如果Activity在5秒内无法响应屏幕触摸事件和键盘输入事件,就会发生ANR。如果BroadcastReceiver在10秒内没有执行操作,就会发生ANR。 20秒后发球会出现ANR。为了避免ANR,可以启用子例程。线程执行耗时操作,但子线程无法更新UI,所以线程通信需要Handler消息机制、AsyncTask、IntentService。
注:发生ANR时,adb pull data/anr/tarces.txt结合日志分析
4.其他性能优化
一个。常量用 static final 修改
b.使用 SparseArray 代替 HashMap
c.使用线程池来管理线程
d.ArrayList使用常规的for循环来遍历,LinkedList使用foreach。
e.不要过度使用枚举。枚举比整数占用更多的内存空间。
f.连接字符串时,优先使用StringBuilder和StringBuffer。
g。数据库存储采用批量插入+事务
(四)设计模式 1、单例模式:有多种写法。要求能手写并分析利弊。 volatile一般用在双重检查锁中,需要分析一下volatility的原理。
2、观察者模式:要求能够手写。有的面试官会问你在项目中使用过吗?对于那些没有听说过的人,可以谈谈EventBus,它使用观察者模式。
3、适配器模式:要求能手写。有的公司会问它和装饰者模式、代理模式有什么区别?
4. Builder模式+工厂模式:需要手写能力
5、策略模型:这个很少有人问,但是有些电商的人会问。
6. MVC、MVP、MVVM:比较异同,选择自己擅长的,重点关注。
(五)数据结构 1、HashMap、LinkedHashMap、ConcurrentHashMap在用法和原理上有什么区别?很多公司都会测试HashMap原理,通过它做一些扩展,比如中国13亿人口的年龄排序问题,年龄对应桶的数量。 ,相同的年龄和相同的哈希问题是相似的。
2.与ArrayList和LinkedList相比,这个比较简单。
3.我还对平衡二叉树、二叉搜索树和红黑树进行了测试。
4.Set原理,这个有点类似于HashMap的测试。测试与hash算法有关。有人问我常用的哈希算法。 HashSet内部使用HashMap
(6)算法:复习算法可以去LeetCode和牛客网复习题。
(7)源码理解项目中或多或少都会用到开源框架。很多公司喜欢问原理,有没有看过源码。比如最常用的网络框架Okhttp。现在Retrofit+RxJava也很流行。