我的微信小号有一组特殊的朋友。他们从 CSDN上看到我之前发布的博客后,留下邮箱询要面试资料的,我在邮箱发送资料之后我们互相添加微信认识聊上的,和他们沟通交流中可以明显感觉他们的就业焦虑。一方面担心受疫情的影响,心仪的公司缩招或者不招;另一方面则是自己技术的不自信,担心面试不通过。我很能理解他们,有一个哥们我们前后断断续续聊了将近有一个月的时间。上周,这个哥们激动地跟我说:“多亏了你分享的那份面试资料,我拿到小米的offer了”!虽然我们素未谋面,但是我是真的替他高兴,感觉帮到他了自己也很有成就感。
下面是这位哥们这段时间面试总结出来的面经,让我帮忙给分享出来,他说希望大家都和他一样能够找到满意的工作。
面试题
五遍刷题法:
- 第一遍,直接看解法
多解法,比较解法优劣,默写好的解法
- 第二遍,打开leetcode,直接开始写
多种解法比较,调优
- 第三遍,过一天之后,再重复做题
- 第四遍,过了一周,再来反复练、
- 第五遍,面试前一周,恢复性训练
通过以上方法重复练习,大概刷100题就足以应付面试,如果每天刷3道,大概准备一个月即可
接下来是整理的一系列大厂的面试题及详细解析:(面试题的详细解析我都整理成了几个文档,有需要的可以这里直接领取。)
美团 Android 面试真题解析
Android 基础知识点
- 四大组件的生命周期
- Activity 之间的通信方式
- 横竖屏切换的时候,Activity 各种情况下的生命周期
- Activity 与 Fragment 之间生命周期比较
- Activity 上有 Dialog 的时候按 Home 键时的生命周期
- 两个 Activity 之间跳转时必然会执行的是哪几个方法?
- 前台切换到后台,然后再回到前台,Activity 生命周期回调方法。 弹出 Dialog,生命值周期回调方法。
- Activity 的四种启动模式对比
- Activity 状态保存于恢复
- fragment 各种情况下的生命周期是如何管理的
- Service 的开启方式,原理是怎样的?
- 请描述一下 Service 的生命周期
- .........
Android 源码相关分析
- Android 动画框架实现原理
- Android 各个版本 API 的区别
- Requestlayout,onlayout,onDraw,DrawChild 区别与联系
- invalidate 和 postInvalidate 的区别及使用
- Activity-Window-View 三者的差别
- 如何优化自定义 View,你进行优化的一般方向是怎样的?
- 低版本 SDK 如何实现高版本 api?
- 描述一次网络请求的流程
- HttpUrlConnection 和 okhttp 关系
- Bitmap 对象的理解
- looper 架构
- .........
常见的一些原理性问题
- Handler 机制和底层实现
- Handler、Thread 和 HandlerThread 的差别
- handler 发消息给子线程,looper 怎么启动?
- 关于 Handler,在任何地方 new Handler 都是什么线程下?
- ThreadLocal 原理,实现及如何保证 Local 属性?
- 请解释下在单线程模型中 Message、Handler、Message Queue、Looper 之间的关系
- 请描述一下 View 事件传递分发机制
- Touch 事件传递流程
- 事件分发中的 onTouch 和 onTouchEvent 有什么区别,又该如何使用?
- View 和 ViewGroup 分别有哪些事件分发相关的回调方法
- View 刷新机制
- .........
百度 Android 面试真题解析
Android 面试题
- 跨进程通信的几种方式
- wait 和 sleep 的区别
- String,StringBuffer,StringBuilder 的区别
- View 和 SurfaceView 的区别
- View 的绘制原理
- 简述 JNI
- 简述 TCP,UDP,Socket
- 音视频相关类
- 进程和线程的区别
- 内存泄露如何查看和解决
- View 的分发机制,滑动冲突
- RecyclerView 和 ListView 的区别
- .........
Java 面试题
- HashMap
- ArrayList
- LinkedList
- Hashset 源码分析
- 内存模型
- 垃圾回收算法(JVM)
- 垃圾回收机制和调用 System.gc()的区别?
- 类加载过程
- 反射
- 多线程和线程池
- HTTP、HTTPS、TCP/IP、Socket 通信、三次握手四次挥手 过程
- 设计模式(六大基本原则、项目中常用的设计模式、手写 单例等)
- .........
kotlin
- 、=和 equal 的区别?
- var 和 val 的区别?
- Kotlin 中默认参数的作用以及原理?
- Kotlin 中顶层函数的原理
- 中缀函数是什么?注意点?
- 解构函数的本质?
- 扩展函数的本质?
- 扩展函数和成员函数的区别?
- Kotlin 中常用的类的修饰符有哪些?
- Kotlin 中可见性修饰符有哪些?
- Kotlin 中的内部类和 Java 中的内部类有什么不同?
- Kotlin 属性代理背后原理?
- .........
网络
- HTTP 是哪一层的协议,常见的 HTTP 状态码有哪些,分别代表什么意思?
- HTTP 1.1 和 HTTP 2 有什么区别?
- HTTP 和 HTTPS 有什么区别?
- SSL/TLS 的握手过程?
- TCP 的三次握手过程,为什么需要三次,而不是两次或者四次?
- TCP 的四次挥手过程?
- TCP 和 UDP 有什么区别?
- .........
华为Android 面试真题解析
Java 基础
- 数据类型
- String
- 运算
- 关键字
- Object 通用方法
- 继承
- 反射
- .........
Java 容器
- 容器中的设计模式
- Vector
- CopyOnWriteArrayList
- LinkedList
- HashMap
- ConcurrentHashMap
- .........
Java 并发
- 使用线程
- 基础线程机制
- 中断
- 互斥同步
- 线程之间的协作
- 线程状态
- J.U.C - AQS
- .........
Android 知识点汇总
- Activity
- Fragment
- Service
- BroadcastReceiver
- ContentProvider
- 数据存储
- View
- 进程
- Parcelable 接口
- IPC
- Bitmap
- .........
Android 扩展知识点
- ART
- Apk 包体优化
- Hook
- Proguard
- 架构
- Jetpack
- NDK 开发
- 计算机网络基础
- 类加载器
- .........
Android 开源库源码分析
- LeakCanary
- EventBus
- Glide
- install
- ARouter
- 插件化(不同插件化机制原理与流派,优缺点。 局限性)
- 热修复
- RXJava (RxJava 的线程切换原理)
- Retrofit
- OkHttp
- .........
设计模式汇总
- 设计模式分类
- 面向对象六大原则
- 工厂模式
- 单例模式
- 建造者模式
- 原型模式
- 适配器模式
- 观察者模式
- 代理模式
- 责任链模式
- .........
常见面试算法题汇总
- 排序
- 二叉树
- 链表
- 栈 / 队列
- 二分
- 哈希表
- 堆 / 优先队列
- 二叉搜索树
- 数组 / 双指针
- 贪心
- 字符串处理
- .........
腾讯 Android 面试真题解析
Java 基础部分
- HashMap 和 HashTable 以及 CurrentHashMap 的区别
- synchronized 和 volatile 、ReentrantLock 、CAS 的 区别
- JVM 类加载机制、垃圾回收算法对比、Java 虚拟机结 构等
- Java 的四大引用
- Java 的泛型,<? super T> 和 <? extends T> 的区别
- Java 线程有哪些状态,有哪些锁,各种锁的区别
- final 、finally、finalize 区别
- 接口和抽象类的区别
- sleep 、wait、yield 的区别,wait 的线程如何唤醒它?
- java 中==和 equals 和 hashCode 的区别
- String、StringBuffer、StringBuilder 区别
- .........
Jvm部分
- Jvm 内存区域是如何划分的?
- Jvm 内存模型是怎么样的?
- String s1 = "abc"和 String s2 = new String("abc")的区别, 生成对象的情况
- 如何判断对象可回收?
- GC 的常用算法?
- Minar GC 和 Full GC 的区别?
- 说一下四种引用以及他们的区别?
- 类加载的过程?
- 类加载的机制,以及为什么要这样设计?
- .........
计算机网络部分
- TCP 与 UDP 的区别
- 三次握手、四次挥手。为啥是三次不是两次?
- HTTPS 和 HTTP 的区别。HTTP 2.0,3.0?
- 浏览器输入一个 URL,按下回车网络传输的流程?
- TCP 建立连接后,发包频率是怎样的?
- OKHttp
- 如何验证证书的合法性?
- https 中哪里用了对称加密,哪里用了非对称加密,对加 密法(如 RSA)等是否有了解?
- client 如何确定自己发送的消息被 server 收到?
- 谈谈你对 WebSocket 的理解
- WebSocket 与 Socket 的区别
- 谈谈你对安卓签名的理解
- 请解释安卓为啥要加签名机制?
- .........
Android 面试题
- 什么是 ANR 如何避免它?
- Activity 和 Fragment 生命周期有哪些?
- 横竖屏切换时候 Activity 的生命周期
- AsyncTask 的缺陷和问题,说说他的原理
- onSaveInstanceState() 与 onRestoreIntanceState()
- android 中进程的优先级?
- Bunder 传递对象为什么需要序列化?Serialzable 和 Parcelable 的区别?
- 动画
- Context 相关
- Android 各版本新特性
- Json
- Jar 和 Aar 的区别
- Android 为每个应用程序分配的内存大小是多少
- Merge、ViewStub 的作用
- ContentProvider 使用方法
- Android 怎么加速启动 Activity?
- .........
Android Framework 相关
- Android 系统架构
- View 的事件分发机制?滑动冲突怎么解决?
- View 的绘制流程?
- 跨进程通信
- Android 系统启动流程是什么?
- 启动一个程序,可以主界面点击图标进入,也可以从一 个程序中
- AMS 家族重要术语解释
- App 启动流程
- ActivityThread 工作原理
- 说下四大组件的启动过程,四大组件的启动与销毁的方 式
- AMS 是如何管理 Activity 的?
- 理解 Window 和 WindowManager
- WMS 是如何管理 Window 的?
- 大体说清一个应用程序安装到手机上时发生了什么?
- .........
性能优化专题
- 你们做了哪些稳定性方面的优化?
- 性能稳定性是怎么做的?
- 业务稳定性如何保障?
- 如果发生了异常情况,怎么快速止损?
- 启动优化是怎么做的?
- 启动优化有哪些容易忽略的注意点?
- 你们内存优化项目的过程是怎么做的?
- 你做了内存优化最大的感受是什么?
- 你在做布局优化的过程中用到了哪些工具?
- 布局为什么会导致卡顿,你又是如何优化的?
- 做完布局优化有哪些成果产出?
- .........
小米 Android 面试真题解析
一面 (70min)
- int和Integer的区别
- 面向对象的三大特性,对多态对理解
- 什么是内部类,内部类的类型
- 静态内部类
- 静态内部类中如何引用外部类的对象
- java四大引用
- 抽象类和接口的区别
- 静态属性和静态方法能不能被继承和重写
- 进程和线程的区别
- Android进程间通信
- java常用数据结构
- 堆和栈的区别,那些数据是放在堆里面的
- 深拷贝和浅拷贝
- GC
- SharedPreferences可以用于跨进程通信吗
- Service启动方式,Activity与Service通信如何启动
- 内存泄漏与OOM
- 线程如何关闭,线程没执行完如何关闭
- Android动画,属性动画怎么用的
- 如何实现的自定义折线图
- kotlin与java的区别
- handler机制
二面 80min
- 实习最大的收获
- 实习学到的架构的优点
- 实习过程中碰到的难点
- 混合开发了解吗
- jvm类加载过程
- 多线程并发如何处理
- sleep和wait的区别
- 反射的使用场景
- 反射的缺点
- Error和Exception的区别
- jetpack出现的原因
- SharedPreferences的缺陷
- Sp是线程安全的吗
- 事件分发机制
- gc垃圾回收机制
- livedata和rxjava的相同点和不同点
- Android跨进程通信
- startService与bindService的区别
- bindService与ContentProvider跨进程通信的区别
- 熟悉的设计模式
- MVC,MVP,MVVM
- 手写快排
- 生产者消费者方式
- HashMap原理
算法合集
- 排序
- 二叉树
- 链表
- 栈 / 队列
- 二分
- 哈希表
- 堆 / 优先队列
- 二叉搜索树
- 数组 / 双指针
- 贪心
- 字符串处理
- .........
kotlin 专题
- 基础
- 函数
- 类、对象和接口
- lambda
- 类型系统
- 协程
- .........
flutter 专题
Dart 当中的 「..」表示什么意思? Dart 的作用域 Dart 是不是单线程模型?是如何运行的? Dart 是如何实现多任务并行的? 说一下 Dart 异步编程中的 Future 关键字? 说一下 Dart 异步编程中的 Stream 数据流? 请简单介绍下 Flutter 框架,以及它的优缺点? 介绍下 Flutter 的理念架构 介绍下 FFlutter 的 FrameWork 层和 Engine 层,以及它们 的作用 介绍下 Widget、State、Context 概念 StatefulWidget 的生命周期
- .........
JNI 模块专题
- 静态注册
- 动态注册
- 数据类型映射
- 对象数组引用类型
- jni 函数默认参数
- jni 是如何访问 java 中的方法和字段
- jni 访问 java 中的静态方法
- jni 访问 java 中的字段
- jni 访问 Java 中的静态字段
- jni 中更新 java 的字段内容
- jni 中创建 java 类实例
- jni 中的异常
- 常用函数封装
- .........
职业规划
如果你的职业技能满足了面试岗位的需求,剩下的面试官会关注你对自己的职业规划和想法。切记不要好高骛远,一山更比一山高。
我觉得低调做人高调做事更符合我们程序员的性格,对技术的渴望和追求不断提升自我才可以让你在这个专业领域走的更远。最后衷心祝福大家找到好的归宿。
最后
多余的话就不讲了,接下来将分享面试的一个复习路线,如果你也在准备面试但是不知道怎么高效复习,可以参考一下我的复习路线,有任何问题也欢迎一起互相交流,加油吧!
这里给大家提供一个方向,进行体系化的学习:
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进阶
知识梳理完之后,就需要进行查漏补缺,所以针对这些知识点,我手头上也准备了不少的电子书和笔记,这些笔记将各个知识点进行了完美的总结。
3、读源码,看实战笔记,学习大神思路
“编程语言是程序员的表达的方式,而架构是程序员对世界的认知”。所以,程序员要想快速认知并学习架构,读源码是必不可少的。阅读源码,是解决问题 + 理解事物,更重要的:看到源码背后的想法;程序员说:读万行源码,行万种实践。
主要内含微信 MMKV 源码、AsyncTask 源码、Volley 源码、Retrofit源码、OkHttp 源码等等。
4、面试前夕,刷题冲刺
面试的前一周时间内,就可以开始刷题冲刺了。请记住,刷题的时候,技术的优先,算法的看些基本的,比如排序等即可,而智力题,除非是校招,否则一般不怎么会问。
关于面试刷题,我个人也准备了一套系统的面试题,帮助你举一反三。
总结
改变人生,没有什么捷径可言,这条路需要自己亲自去走一走,只有深入思考,不断反思总结,保持学习的热情,一步一步构建自己完整的知识体系,才是最终的制胜之道,也是程序员应该承担的使命。
以上这些内容均免费分享给大家,需要完整版的朋友,点这里可以看到全部内容。