前言
最近不少人在后台私信问我:做了几年 Android 工程师,现在很迷茫,想跳槽但是没有目标,不知道接下来该朝着哪个方向发展。
确实,春节过后,大家都在为开年做准备,跳槽也好,学习蓄力也罢,一切都是个新的开始。Android 作为编程届第一大语言,使用人数最多,也最成熟,当然了,竞争压力也相对来说大一些。
在这个俗称“金三银四”的跳槽季,很多人都蠢蠢欲动,想要拿更高的薪资,想要去更大的平台......
但其实对于大多数的 Android 工程师来说,其实都是没有形成系统而全面的知识体系的,因此,90% 的人都折在了技术面试上。
接下来先分享一波老司机的多个大厂的面试知识点总结,干货走起!
大厂面试题总结
摘要: “基础 Android 知识掌握的不错,学习能力也不错。但是基础知识部分比较薄弱,有些概念和逻辑掌握不清。” 感谢春林的这句话。
想进大厂?快来恶补这些知识点!
Java
Java基础
- 构成多态的要素(京东)
- 重载和重写的区别(京东)
- 抽象类和接口的区别
- 泛型通配符 super extends的作用和区别
- Java内存模型(小米)
- String为什么要设计成为final的(字节跳动)
- String StringBuffer StringBuilder在进行字符串操作时的效率;这里主要考察String在内存中是如何创建的(字节跳动)
多线程相关
- 锁分哪几类
- CAS无锁编程的原理
- ReentrantLock的实现原理
- AQS原理(小米,京东)
- Synchronized的原理以及与ReentrantLock的区别(360)
- synchronized在JDK1.8之后做了哪些优化(京东)
- synchronized static与非static锁的区别和范围(小米)
- volatile作用以及与synchronized的区别(小米,京东)
- sleep和wait的区别
- sleep是可中断的么(小米)
- 线程间通信的方式(小米)
- 线程生命周期
- 线程池的相关原理
- 主存和工作内存的区别
虚拟机相关
- JVM DVM ART的区别(360)
- 类加载过程
- 双亲委派模型
设计模式
- 说说常用的设计模式
- 手写观察者模式(多个公司要求手写)
其它
- GC过程以及GC算法了解么
- Java的引用类型以及区别
- HashMap原理(京东)
- HashMap1.7 和1.8的区别
- ConcurrentHashMap原理
Android基础部分
Activity
- Activity的启动模式,区别
- Activity如何保存状态的
广播
- 广播的分类
- 广播的工作原理
- 可以再onReceive中开启线程么,会有什么问题
Service
- IntentService工作原理
ContentProvider
- 工作原理
AndroidVIew相关
自定义View的流程
- View的测绘流程
- 在onResume中可以测量宽高么
View的事件分发机制(58 京东还有一些其他的 总体问的还是挺多的)
- onTouchListener onTouchEvent onClick的执行顺序
- 怎么拦截事件 onTouchEvent如果返回false onClick还会执行么等等
- onTouch返回true,onClick还会执行么
动画(车和家)
- 动画的分类以及区别
- 属性动画的原理
- 属性动画与普通的动画有什么区别
- 插值器 估值器的区别
集成框架部分
- RxJava原理
- 多次操作subscribeOn和ObserveOn能否成功
- Map Flatmap的区别等
- 会问一些操作符的使用
- 图片加载框架
- Glide和Picasso的区别
- Glide的工作原理 如何实现缓存的等等
Android相关组件原理
Handler(面试问的比较多,字节跳动、小米等)
- Handler的基本原理
- Handler如果没有消息处理是阻塞的还是非阻塞的
- handler.post(Runnable) runnable是如何执行的
- handler的Callback和handlemessage都存在,但callback返回true handleMessage还会执行么
- Looper的原理
- Looper如何在子线程中创建
- Looper、handler、线程间的关系。例如一个线程可以有几个Looper可以对应几个Handler
- Looper是死循环但为什么没有导致ANR
- ThreadLocal的原理,以及在Looper是如何应用的
AsyncTask
- AsyncTask的原理
- AsyncTask中的任务是串行的还是并行的
- HandlerThread的原理
Android优化相关
- 内存泄漏查找
- ANR查找
- CPU波动
- 内存抖动
- 会问当前项目中是如何进行性能优化分析的
Android其它
- 进程通信你用过哪些 原理是什么(小米,字节跳动)
- Binder的原理(问的较多)
- 启动一个Activity的流程分析
- Bitmap相关的、内存优化等(酷我音乐)
- MVP MVVM MVC的区别 结合项目说说MVP的优缺点
- 冷启动 热启动的概念(酷我音乐)
网络
- TCP的三次握手
- Socket的使用
程序员之路——学习经验总结分享
程序员这个行业,日新月异,技术体系更新速度快,新技术新框架层出不穷,所有的技术都像是一个无底洞,当你学得越多就会发现不懂的越多,不懂的越多,需要学习的就更多。
因此,一旦选择了这个行业,就意味着你必须不断学习才能跟得上大家的脚步,而要想成为一名优秀的程序员,更是需要通过正确的方法,设定正确的目标来进行不断地学习。
下面是我工作几年以来总结的一些自己已经公司一些大佬的学习方法:
1.读官方文档
读文档,读文档,读文档,重要的事情说三遍!!!
如果你是一名有一定开发经验程序员,那我强烈地建议你一定要看官方文档!!!
如果你是一名初学者,那现阶段来说,看文档会是件非常非常的吃力的事,但我还是强烈地建议你一定要看官方文档,不过可以在你通过视频教程或是书籍学习并入门之后再慢慢的阅读。
2.官方文档扯完了,我们接着来聊聊如何进阶学习
1、看视频进行系统学习
前几年的Crud经历,让我明白自己真的算是菜鸡中的战斗机,也正因为Crud,导致自己技术比较零散,也不够深入不够系统,所以重新进行学习是很有必要的。我差的是系统知识,差的结构框架和思路,所以通过视频来学习,效果更好,也更全面。关于视频学习,个人可以推荐去B站进行学习,B站上有很多学习视频,唯一的缺点就是免费的容易过时。
另外,我自己也珍藏了好几套视频,有需要的我也可以分享给你。
2、进行系统梳理知识,提升储备
客户端开发的知识点就那么多,面试问来问去还是那么点东西。所以面试没有其他的诀窍,只看你对这些知识点准备的充分程度。so,出去面试时先看看自己复习到了哪个阶段就好。
- 架构师筑基必备技能:深入Java泛型 注解深入浅出 并发编程 数据传输与序列化 Java虚拟机原理 反射与类加载 动态代理 高效IO
- Android高级UI与FrameWork源码:高级UI晋升 Framework内核解析 Android组件内核 数据持久化
- 360°全方面性能调优:设计思想与代码质量优化 程序性能优化 开发效率优化
- 解读开源框架设计思想:热修复设计 插件化框架解读 组件化框架设计 图片加载框架 网络访问框架设计 RXJava响应式编程框架设计 IOC架构设计 Android架构组件Jetpack
- NDK模块开发:NDK基础知识体系 底层图片处理 音视频开发
- 微信小程序:小程序介绍 UI开发 API操作 微信对接
- Hybrid 开发与Flutter:Html5项目实战 Flutter进阶
知识梳理完之后,就需要进行查漏补缺,所以针对这些知识点,我手头上也准备了不少的电子书和笔记,这些笔记将各个知识点进行了完美的总结。
主要内容:
Java 基础(★★)
- 面向对象思想
- 多态
- 异常处理
- 数据类型
- Java 的 IO
- 集合
- Java 多线程
Java 高级(★★)
- Java 中的反射
- Java 中的动态代理
- Java 中的设计模式&回收机制
- Java 的类加载器
Android 基础(★★★)
- Android 基本常识
- Activity
- Service
- BroadCastReceiver
- ContentProvider&数据库
- Android 中的布局
- ListView
- JNI & NDK
- Android 中的网络访问
- Intent
- Fragment
Android 高级(★★★)
- Android 性能优化
- Android 屏幕适配
- AIDL
- 自定义控件
- Android 中的事件处理
- Android 签名
- Android 中的动画
- 网络协议
- 其他
3、读源码,看实战笔记,学习大神思路
“编程语言是程序员的表达的方式,而架构是程序员对世界的认知”。所以,程序员要想快速认知并学习架构,读源码是必不可少的。阅读源码,是解决问题 理解事物,更重要的:看到源码背后的想法;程序员说:读万行源码,行万种实践。
主要内含微信 MMKV 源码、AsyncTask 源码、Volley 源码、Retrofit源码、OkHttp 源码等等。
4、面试前夕,刷题冲刺
面试的前一周时间内,就可以开始刷题冲刺了。请记住,刷题的时候,技术的优先,算法的看些基本的,比如排序等即可,而智力题,除非是校招,否则一般不怎么会问。
关于面试刷题,我个人也准备了一套系统的面试题,帮助你举一反三。
会读文档了,又阅读了这么多学习资料,是不是就不用其他方式再学习了?
答案肯定是不可以!!!
相比上面的学习资料,我们还需要根据自己的情况额外地进行书籍教程的学习。
有人觉得自己总是静不下心来看书,我的方法是,阅读某本书的时候给自己定一个小目标,比如每天阅读该书至少20页内容,这样每天学习的内容不会太多,不容易让人变得焦躁,当然,你可以根据自己的情况制定每天的阅读量,如果按照20页每天的阅读量来算,一本500页的书,不到一个月就读完了。
下面整理了目前最主流的中级,高级进阶书籍。感兴趣可以收藏一下,作为一个参考~
中级进阶推荐看一下以下这几本书:
《Android从入门到精通(附光盘)》 明日科技 编 《第一行代码2 Android(第二版)》 郭霖 著 《Android开发进阶 从小工到专家 》何红辉 著 《Android进阶之光 》刘望舒 著 《Android开发艺术探索》 任玉刚 著 《Android群英传》 徐宜生 著 《疯狂Android讲义 》李刚 著
Android高级进阶
高级进阶主要包括,设计模式,Java语言,性能调优,数据结构算法,架构,NDK等相关书籍。打算进大厂的小伙伴强烈推荐!
设计模式有关书籍:
《Android 源码设计模式解析与实战 第2版 》 《O'Reilly:Head First设计模式(中文版) 》 《设计模式 ---- 可复用面向对象软件的基础 》
与Android密切有关的语言书籍:
《深入理解Java虚拟机 》 《Android Gradle权威指南 》 《实战Gradle 》 《Kotlin程序开发入门精要 》
性能优化有关:
《移动APP性能评测与优化 》 《Android应用性能优化最佳实践 》 《腾讯Android自动化测试实战 》 《Android移动性能实战 》 《高性能Android应用开发 》
数据结构和算法有关:
《编程珠玑(第2版 修订版) 》 《程序员代码面试指南:IT名企算法与数据结构题目最优解 》 《算法之美 》
架构有关:
《代码整洁之道 Clean Code 》 《代码整洁之道 程序员的职业素养 The Clean Coder 》 《重构 改善既有代码的设计 》
NDK开发有关的书籍:
《Android C 高级编程:使用NDK》
面试有关的书籍:
《技术之瞳:阿里巴巴技术笔试心得》 《编程之美:微软技术面试心得》 《剑指Offer:名企面试官精讲典型编程题(第2版)》 《HR不会告诉你的那些面试技巧 》 《程序员你伤不起 》
最后以上内容均免费分享给大家,需要完整版的朋友,点这里可以看到全部内容。
一些话: 面试真的是有够烦的,因为题目是随机的,而知识是无穷的。直到被很多答案都是没有标准的。就好像上面提到的 MV* ,也许到现在上面的理解依旧有问题,但是我觉得架构是死的,而最合适的才是最好的。 但是有一点,面试也是一种学习,至少它能让你知道你的薄弱点在哪。