前言
最近不少人在后台私信问我 : 做了几年 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* , 也许到现在上面的理解依旧有问题 , 但是我觉得架构是死的 , 而最合适的才是最好的。
但是有一点 ,面试也是一种学习 , 至少它能让你知道你的薄弱点在哪。
原文链接:https://blog.csdn.net/weixin_44339238/article/details/114090403