本文主要是介绍2021最新Android知识体系总结,瞬间高大上了!,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
# Java面试题
**1.GC机制**
垃圾回收需要完成两件事:找到垃圾,回收垃圾。 找到垃圾一般的话有两种方法:
* **引用计数法:**?当一个对象被引用时,它的引用计数器会加一,垃圾回收时会清理掉引用计数为0的对象。但这种方法有一个问题,比方说有两个对象 A 和 B,A 引用了 B,B 又引用了 A,除此之外没有别的对象引用 A 和 B,那么 A 和 B 在我们看来已经是垃圾对象,需要被回收,但它们的引用计数不为 0,没有达到回收的条件。正因为这个循环引用的问题,Java 并没有采用引用计数法。
* **可达性分析法:**?我们把 Java 中对象引用的关系看做一张图,从根级对象不可达的对象会被垃圾收集器清除。根级对象一般包括 Java 虚拟机栈中的对象、本地方法栈中的对象、方法区中的静态对象和常量池中的常量。 回收垃圾的话有这么四种方法:
* **标记清除算法:**?顾名思义分为两步,标记和清除。首先标记到需要回收的垃圾对象,然后回收掉这些垃圾对象。标记清除算法的缺点是清除垃圾对象后会造成内存的碎片化。
* **复制算法:**?复制算法是将存活的对象复制到另一块内存区域中,并做相应的内存整理工作。复制算法的优点是可以避免内存碎片化,缺点也显而易见,它需要两倍的内存。
* **标记整理算法:**?标记整理算法也是分两步,先标记后整理。它会标记需要回收的垃圾对象,清除掉垃圾对象后会将存活的对象压缩,避免了内存的碎片化。
* **分代算法:**?分代算法将对象分为新生代和老年代对象。那么为什么做这样的区分呢?主要是在Java运行中会产生大量对象,这些对象的生命周期会有很大的不同,有的生命周期很长,有的甚至使用一次之后就不再使用。所以针对不同生命周期的对象采用不同的回收策略,这样可以提高GC的效率。
新生代对象分为三个区域:Eden 区和两个 Survivor 区。新创建的对象都放在 Eden区,当 Eden 区的内存达到阈值之后会触发 Minor GC,这时会将存活的对象复制到一个 Survivor 区中,这些存活对象的生命存活计数会加一。这时 Eden 区会闲置,当再一次达到阈值触发 Minor GC 时,会将Eden区和之前一个 Survivor 区中存活的对象复制到另一个 Survivor 区中,采用的是我之前提到的复制算法,同时它们的生命存活计数也会加一。
这个过程会持续很多遍,直到对象的存活计数达到一定的阈值后会触发一个叫做晋升的现象:新生代的这个对象会被放置到老年代中。 老年代中的对象都是经过多次 GC 依然存活的生命周期很长的 Java 对象。当老年代的内存达到阈值后会触发 Major GC,采用的是标记整理算法。
**2.JVM内存区域的划分,哪些区域会发生 OOM**
JVM 的内存区域可以分为两类:线程私有和区域和线程共有的区域。 线程私有的区域:程序计数器、JVM 虚拟机栈、本地方法栈 线程共有的区域:堆、方法区、运行时常量池
* **程序计数器。**?每个线程有有一个私有的程序计数器,任何时间一个线程都只会有一个方法正在执行,也就是所谓的当前方法。程序计数器存放的就是这个当前方法的JVM指令地址。
* **JVM虚拟机栈。**?创建线程的时候会创建线程内的虚拟机栈,栈中存放着一个个的栈帧,对应着一个个方法的调用。JVM 虚拟机栈有两种操作,分别是压栈和出站。栈帧中存放着局部变量表、方法返回值和方法的正常或异常退出的定义等等。
* **本地方法栈。**?跟 JVM 虚拟机栈比较类似,只不过它支持的是 Native 方法。
* **堆。**?堆是内存管理的核心区域,用来存放对象实例。几乎所有创建的对象实例都会直接分配到堆上。所以堆也是垃圾回收的主要区域,垃圾收集器会对堆有着更细的划分,最常见的就是把堆划分为新生代和老年代。
* 方法区。方法区主要存放类的结构信息,比如静态属性和方法等等。
* 运行时常量池。运行时常量池位于方法区中,主要存放各种常量信息。
其实除了程序计数器,其他的部分都会发生 OOM。
* **堆。**?通常发生的 OOM 都会发生在堆中,最常见的可能导致 OOM 的原因就是内存泄漏。
* **JVM虚拟机栈和本地方法栈。**?当我们写一个递归方法,这个递归方法没有循环终止条件,最终会导致 StackOverflow 的错误。当然,如果栈空间扩展失败,也是会发生 OOM 的。
* 方法区。方法区现在基本上不太会发生 OOM,但在早期内存中加载的类信息过多的情况下也是会发生 OOM 的。
**3.类加载过程**
**4.双亲委派模型**
**5.Java 中的集合类**
**6.HashMap 的原理**
**7.什么情况下 Java 会产生死锁,如何定位、修复,手写死锁**
**8.sleep 和 wait 的区别**
**9.join 的用法**
**10.volatile和synchronize的区别**
**11.Java中的线程池**
**12.线程通信**
**13.Java中的并发集合**
**14.Java中生产者与消费者模式**
**15.final、finally、finalize区别**
**16.Java 中单例模式**
**17.Java中引用类型的区别,具体的使用场景**
**18.Exception 和 Error的区别**
**19.volatile**
![](http://www.www.zyiz.net/i/li/?n=2&i=images/20210707/1625669870785340.jpg)
# 网络相关面试题
**1.http 状态码**
**2.http 与 https 的区别?https 是如何工作的?**
**3.TCP三次握手流程**
![](http://www.www.zyiz.net/i/li/?n=2&i=images/20210707/1625669871527624.jpg)
# Android面试题
**1.进程间通信的方式有哪几种**
AIDL 、广播、文件、socket、管道
**2.广播静态注册和动态注册的区别**
1. 动态注册广播不是常驻型广播,也就是说广播跟随 Activity 的生命周期。注意在 Activity 结束前,移除广播接收器。 静态注册是常驻型,也就是说当应用程序关闭后,如果有信息广播来,程序也会被系统调用自动运行。
2. 当广播为有序广播时:优先级高的先接收(不分静态和动态)。同优先级的广播接收器,动态优先于静态
3. 同优先级的同类广播接收器,静态:先扫描的优先于后扫描的,动态:先注册的优先于后注册的。
4. 当广播为默认广播时:无视优先级,动态广播接收器优先于静态广播接收器。同优先级的同类广播接收器,静态:先扫描的优先于后扫描的,动态:先注册的优先于后册的。
**3.Android 性能优化工具使用(这个问题建议配合Android中的性能优化)**
Android 中常用的性能优化工具包括这些:Android Studio 自带的 Android Profiler、LeakCanary、BlockCanary
Android 自带的 Android Profiler 其实就很好用,Android Profiler 可以检测三个方面的性能问题:CPU、MEMORY、NETWORK。
LeakCanary 是一个第三方的检测内存泄漏的库,我们的项目集成之后 LeakCanary 会自动检测应用运行期间的内存泄漏,并将之输出给我们。
BlockCanary 也是一个第三方检测UI卡顿的库,项目集成后Block也会自动检测应用运行期间的UI卡顿,并将之输出给我们。
**4.Android中的类加载器**
* PathClassLoader,只能加载系统中已经安装过的 apk
* DexClassLoader,可以加载 jar/apk/dex,可以从 SD卡中加载未安装的 apk
**5.Android中的动画有哪几类,它们的特点和区别是什么**
**6.Handler 机制**
**7.Android 性能优化**
**8.Android 内存优化**
**9.Binder 机制**
**10.LruCache的原理**
**11.DiskLruCache原理**
**12.设计一个图片的异步加载框架**
**13.Android中的事件分发机制**
**14.View的绘制流程**
**15.Android 源码中常见的设计模式以及自己在开发中常用的设计模式**
**16.Android与 js 是如何交互的**
**17.热修复原理**
**18.Activity 启动过程**
**19.SparseArray 原理**
**20.图片加载如何避免 OOM**
**21.大图加载**
![](http://www.www.zyiz.net/i/li/?n=2&i=images/20210707/1625669871779117.jpg)
# Android三方库的源码分析
**1.OkHttp**
**2.Retrofit**
**3.RxJava**
**4.Glide**
**5.EventBus**
![](http://www.www.zyiz.net/i/li/?n=2&i=images/20210707/1625669872446827.jpg)
# 数据结构与算法
**1.手写快排**
**2.手写归并排序**
**3.手写堆以及堆排序**
**4.说一下排序算法的区别(时间复杂度和空间复杂度)**
**工作中解决了什么难题,做了什么有成就感的项目(这个问题一定会问到,所以肯定要做准备)**
## 最后
其实Android开发的知识点就那么多,面试问来问去还是那么点东西。所以面试没有其他的诀窍,只看你对这些知识点准备的充分程度。so,出去面试时先看看自己复习到了哪个阶段就好。
以上分享[【我的阿里P7移动开发架构师学习笔记】](https://github.com/a120464/Android-P7/blob/master/Android%E5%BC%80%E5%8F%91%E4%B8%8D%E4%BC%9A%E8%BF%99%E4%BA%9B%EF%BC%9F%E5%A6%82%E4%BD%95%E9%9D%A2%E8%AF%95%E6%8B%BF%E9%AB%98%E8%96%AA%EF%BC%81.md)七大模块整套学习资料均免费分享,需要的小伙伴,我已经上传到石墨文档了,大家自取就可以了。白嫖可以,别忘了给我点个关注哈。
当然我也为你们整理好了百度、阿里、腾讯、字节跳动等等互联网超级大厂的历年面试真题集锦。这也是我这些年来养成的习惯,一定要学会把好的东西,归纳整理,然后系统的消化吸收,这样才能极大的提高学习效率和成长进阶。碎片、零散化的东西,我觉得最没有价值的。就好比你给我一张扑克牌,我只会觉得它是一张废纸,但如果你给我一副扑克牌,它便有了它的价值。这和我们收集资料就要收集那些系统化的,是一个道理。
如果你需要,我把他放在GitHub了,无偿分享的。
[【Android架构视频+BATJ面试专题PDF+学习笔记】](https://github.com/a120464/Android-P7/blob/master/Android%E5%BC%80%E5%8F%91%E4%B8%8D%E4%BC%9A%E8%BF%99%E4%BA%9B%EF%BC%9F%E5%A6%82%E4%BD%95%E9%9D%A2%E8%AF%95%E6%8B%BF%E9%AB%98%E8%96%AA%EF%BC%81.md)
![](http://www.www.zyiz.net/i/li/?n=2&i=images/20210707/1625669872895440.jpg)
网上学习 Android的资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。希望这份系统化的技术体系对大家有一个方向参考。
这篇关于2021最新Android知识体系总结,瞬间高大上了!的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!