腾讯课堂 Android 高级架构系列免费直播公开课
https://ke.qq.com/course/341933?flowToken=1017873&taid=5402300059563949&tuin=7e87248a
Android 中高级面试必知必会
目录
Android 中高级面试必知必会 ......................................................................................................... 1
第一章 Java 相关高频面试解析 ..................................................................................................... 3
1. HashMap ........................................................................................................................... 3
2. ArrayList .......................................................................................................................... 25
3.LinkedList .............................................................................................................................. 30
4.Hashset 源码分析 ................................................................................................................ 35
5. 内存模型 ............................................................................................................................ 47
6. 垃圾回收算法(JVM) ..................................................................................................... 63
7、垃圾回收机制和调用 System.gc()的区别? .................................................................. 64
8. 类加载过程 ..................................................................................................................... 90
9. 反射 ............................................................................................................................... 101
多线程和线程池 ................................................................................................... 112
10.
11.HTTP、HTTPS、TCP/IP、Socket 通信、三次握手四次挥手过程 ................................. 113
12.设计模式(六大基本原则、项目中常用的设计模式、手写单例等) ...................... 120
13.断点续传.......................................................................................................................... 134
14.Java 四大引用 ................................................................................................................. 141
15.Java 的泛型 ..................................................................................................................... 146
16. final、finally、finalize 的区别 ...................................................................................... 157
17.接口、抽象类的区别 ...................................................................................................... 163
第二章 Android d 面试题解析大全 ......................................................................................... 170
1.自定义 View .................................................................................................................... 170
. 1. 事件拦截分发 .............................................................................................................. 174
. 2. 解决过的一些性能问题,在项目中的实际运用 ...................................................... 175
. 3. 性能优化工具 .............................................................................................................. 175
. 4. 性能优化 (讲讲你自己项目中做过的性能优化) .............................................. 180
. 6. Http[s] 请求慢的解决办法 ( DNS 、 携问 带数据、直接访问 IP ) ........... 180
. 7. 缓存自己如何实现 (e LRUCache 原理 ) ........................................................... 180
. 8. 图形图像相关:L OpenGL S ES 管线流程、L EGL 的认识、r Shader 相关 ..... 180
. 9. SurfaceView 、 TextureView 、GLSurfaceView 区别及使用场景 ........................ 180
. 10. 动画、差值器、估值器( Android d 中的 w View 画 动画和属性动画 - - 简书、
Android 画 动画 介绍与使用) ...................................................................................... 180
. 11. MVC 、 MVP 、 MVVM ......................................................................................... 181
. 12. Handler、 、 ThreadLocal、 、 AsyncTask 、 IntentService 原理及应用 ...... 181
. 13. Gradle (y Groovy 语法、e Gradle 插件开发基础) ....................................... 181
. 14. 热修复、插件化 ........................................................................................................ 190
. 15. 组件化架构思路 ........................................................................................................ 190
. 16. 系统打包流程 ............................................................................................................ 213
更多录播视频+架构学习资料免费领取 QQ 2677509374
腾讯课堂 Android 高级架构系列免费直播公开课
https://ke.qq.com/course/341933?flowToken=1017873&taid=5402300059563949&tuin=7e87248a
17. Android 有哪些存储数据的方式。 ............................................................................ 214
. 18. SharedPrefrence 源码和问题点; ............................................................................ 235
. 19. sqlite 相关 .................................................................................................................. 236
. 20. 如何判断一个 P APP 在前台还是后台?............................................................... 253
. 21. 混合开发 .................................................................................................................... 258
Android Framework 高频面试题总结 .................................................................................. 259
第三章:网络相关面试题 ........................................................................................................... 316
一、HTTP/HTTPS .................................................................................................................. 316
二、 TCP/UDP ...................................................................................................................... 325
三、其它重要网络概念 ....................................................................................................... 328
四、常见网络流程机制 ....................................................................................................... 332
第四章:三方源码高频面试总结 ............................................................................................... 332
1.Glide :加载、缓存、LRU 算法 (如何自己设计一个大图加载框架) (LRUCache 原理)
.............................................................................................................................................. 332
2.LeakCanary ......................................................................................................................... 407
3.ARouter .............................................................................................................................. 421
4.RXJava (RxJava 的线程切换原理) .............................................................................. 446
5.Retrofit (Retrofit 在 OkHttp 上做了哪些封装?动态代理和静态代理的区别,是怎么
实现的) ............................................................................................................................... 462
6.OkHttp ................................................................................................................................ 481
第五章 Kotlin 相关 ..................................................................................................................... 498
1.从原理分析 Kotlin 的延迟初始化: lateinit var 和 by lazy ................................................ 498
2.From Java To Kotlin ............................................................................................................. 504
3.怎么用 Kotlin 去提高生产力:Kotlin Tips ........................................................................ 515
4.使用 Kotlin Reified 让泛型更简单安全 ........................................................................... 550
5.Kotlin 里的 Extension Functions 实现原理分析 ............................................................... 559
6.Kotlin 系列之顶层函数和属性 ......................................................................................... 562
7.Kotlin 兼容 Java 遇到的最大的 “坑” ............................................................................ 568
8.Kotlin 的协程 .................................................................................................................... 576
9.Kotlin 协程「挂起」的本质 ............................................................................................ 588
10.到底什么是「非阻塞式」挂起?协程真的更轻量级吗? .......................................... 597
11.资源混淆是如何影响到 Kotlin 协程的 .......................................................................... 600
12.破解 Kotlin 协程 ............................................................................................................ 603
第六章 Flutter 相关 ..................................................................................................................... 615
1. Dart 当中的 「..」表示什么意思? .............................................................................. 615
2. Dart 的作用域 .................................................................................................................. 615
3.Dart 是不是单线程模型?是如何运行的? ................................................................... 616
4. Dart 是如何实现多任务并行的? .................................................................................. 617
5. 说一下 Dart 异步编程中的 Future 关键字? ............................................................... 617
6. 说一下 Dart 异步编程中的 Stream 数据流? .............................................................. 618
7.Stream 有哪两种订阅模式?分别是怎么调用的? ...................................................... 618
8.await for 如何使用? ....................................................................................................... 619
9. 说一下 mixin 机制? ...................................................................................................... 619
更多录播视频+架构学习资料免费领取 QQ 2677509374
腾讯课堂 Android 高级架构系列免费直播公开课
https://ke.qq.com/course/341933?flowToken=1017873&taid=5402300059563949&tuin=7e87248a
Flutter .................................................................................................................................... 620
1. 请简单介绍下 Flutter 框架,以及它的优缺点? ......................................................... 620
2. 介绍下 Flutter 的理念架构 ............................................................................................. 621
3. 介绍下 FFlutter 的 FrameWork 层和 Engine 层,以及它们的作用 ............................. 622
4. 介绍下 Widget、State、Context 概念 .......................................................................... 622
5. 简述 Widget 的 StatelessWidget 和 StatefulWidget 两种状态组件类 .......................... 623
6. StatefulWidget 的生命周期 ............................................................................................. 624
7. 简述 Widgets、RenderObjects 和 Elements 的关系 .................................................... 625
8. 什么是状态管理,你了解哪些状态管理框架? .......................................................... 626
9. 简述 Flutter 的绘制流程 ................................................................................................. 626
10. 简述 Flutter 的线程管理模型 ....................................................................................... 627
11. Flutter 是如何与原生 Android、iOS 进行通信的? .................................................... 628
12. 简述 Flutter 的热重载 .................................................................................................. 628
第一章 Java 相关高频面试解析
1. HashMap
(1)问:HashMap 有用过吗?您能给我说说他的主要用途吗?
答:有用过,我在平常工作中经常会用到 HashMap 这种数据结构,HashMap 是基
于 Map 接口实现的一种键-值对的存储结构,允许 null 值,同时非
有序,非同步(即线程不安全)。HashMap 的底层实现是数组 + 链表 + 红黑树
(JDK1.8 增加了红黑树部分)。它存储和查找数据时,是根据键 key 的 hashCode
的值计算出具体的存储位置。HashMap 最多只允许一条记录的键 key 为 null,
HashMap 增删改查等常规操作都有不错的执行效率,是 ArrayList 和 LinkedList
等数据结构的一种折中实现。
示例代码:
// 创建一个 HashMap,如果没有指定初始大小,默认底层 hash 表数组的
大小为 16
HashMap hashMap = new HashMap();
// 往容器里面添加元素
hashMap.put("小明", "好帅");
hashMap.put("老王", "坑爹货");
hashMap.put("老铁", "没毛病");
hashMap.put("掘金", "好地方");
hashMap.put("王五", "别搞事");
更多录播视频+架构学习资料免费领取 QQ 2677509374
腾讯课堂 Android 高级架构系列免费直播公开课
https://ke.qq.com/course/341933?flowToken=1017873&taid=5402300059563949&tuin=7e87248a
// 获取 key 为小明的元素 好帅
String element = hashMap.get("小明");
// value : 好帅
System.out.println(element);
// 移除 key 为王五的元素
String removeElement = hashMap.remove("王五");
// value : 别搞事
System.out.println(removeElement);
// 修改 key 为小明的元素的值 value 为 其实有点丑
hashMap.replace("小明", "其实有点丑");
// {老铁=没毛病, 小明=其实有点丑, 老王=坑爹货, 掘金=好地方}
System.out.println(hashMap);
// 通过 put 方法也可以达到修改对应元素的值的效果
hashMap.put("小明", "其实还可以啦,开玩笑的");
// {老铁=没毛病, 小明=其实还可以啦,开玩笑的, 老王=坑爹货, 掘金=
好地方}
System.out.println(hashMap);
// 判断 key 为老王的元素是否存在(捉奸老王)
boolean isExist = hashMap.containsKey("老王");
// true , 老王竟然来搞事
System.out.println(isExist);
// 判断是否有 value = "坑爹货" 的人
boolean isHasSomeOne = hashMap.containsValue("坑爹货");
// true 老王是坑爹货
System.out.println(isHasSomeOne);
// 查看这个容器里面还有几个家伙 value : 4
System.out.println(hashMap.size());
• HashMap 的底层实现是数组 + 链表 + 红黑树(JDK1.8 增加了红黑树部分),核心
组成元素有:
int size;用于记录 HashMap 实际存储元素的个数;
float loadFactor;负载因子(默认是 0.75,此属性后面详细解释)。
int threshold;下一次扩容时的阈值,达到阈值便会触发扩容机制 resize
(阈值 threshold = 容器容量 capacity * 负载因子 load factor)。也就是
说,在容器定义好容量之后,负载因子越大,所能容纳的键值对元素个数
就越多。
Node[] table; 底层数组,充当哈希表的作用,用于存储对应 hash
位置的元素 Node,此数组长度总是 2 的 N 次幂。(具体原因后面详
细解释)
示例代码:
更多录播视频+架构学习资料免费领取 QQ 2677509374
腾讯课堂 Android 高级架构系列免费直播公开课
https://ke.qq.com/course/341933?flowToken=1017873&taid=5402300059563949&tuin=7e87248a
public class HashMap extends AbstractMap
implements Map, Cloneable, Serializable {
·····
/* ---------------- Fields -------------- */
/**
* 哈希表,在第一次使用到时进行初始化,重置大小是必要的操作,
* 当分配容量时,长度总是 2 的 N 次幂。
*/
transient Node[] table;
/**
* 实际存储的 key - value 键值对 个数
*/
transient int size;
/**
* 下一次扩容时的阈值
* (阈值 threshold = 容器容量 capacity * 负载因子 load factor).
* @serial
*/
int threshold;
/**
* 哈希表的负载因子
*
* @serial
*/
final float loadFactor;
·····}
• 其中 Node[] table;哈希表存储的核心元素是 Node,Node包含:
final int hash;元素的哈希值,决定元素存储在 Node[] table;哈
希表中的位置。由 final 修饰可知,当 hash 的值确定后,就不能再修改。
final K key; 键,由 final 修饰可知,当 key 的值确定后,就不能再修
改。
V value; 值
Node next; 记录下一个元素结点(单链表结构,用于解决 hash 冲突)
更多录播视频+架构学习资料免费领取 QQ 2677509374
腾讯课堂 Android 高级架构系列免费直播公开课
https://ke.qq.com/course/341933?flowToken=1017873&taid=5402300059563949&tuin=7e87248a
示例代码:
/**
* 定义 HashMap 存储元素结点的底层实现
*/
static class Node implements Map.Entry {
final int hash;//元素的哈希值 由 final 修饰可知,当 hash 的值确定
后,就不能再修改
final K key;// 键,由 final 修饰可知,当 key 的值确定后,就不能再
修改
V value; // 值
Node next; // 记录下一个元素结点(单链表结构,用于解决 hash
冲突)
/**
* Node 结点构造方法
*/
Node(int hash, K key, V value, Node next) {
this.hash = hash;//元素的哈希值
this.key = key;// 键
this.value = value; // 值
this.next = next;// 记录下一个元素结点
}
public final K getKey() { return key; }
public final V getValue() { return value; }
public final String toString() { return key + "=" + value; }
/**
* 为 Node 重写 hashCode 方法,值为:key 的 hashCode 异或 value
的 hashCode
* 运算作用就是将 2 个 hashCode 的二进制中,同一位置相同的值为 0,
不同的为 1。
*/
public final int hashCode() {
return Objects.hashCode(key) ^ Objects.hashCode(value);
}
/**
* 修改某一元素的值
*/
public final V setValue(V newValue) {
更多录播视频+架构学习资料免费领取 QQ 2677509374
腾讯课堂 Android 高级架构系列免费直播公开课
https://ke.qq.com/course/341933?flowToken=1017873&taid=5402300059563949&tuin=7e87248a
V oldValue = value;
value = newValue;
return oldValue;
}
/**
* 为 Node 重写 equals 方法
*/
public final boolean equals(Object o) {
if (o == this)
return true;
if (o instanceof Map.Entry) {
Map.Entry,?> e = (Map.Entry,?>)o;
if (Objects.equals(key, e.getKey()) &&
Objects.equals(value, e.getValue()))
return true;
}
return false;
}
}
hashMap 内存结构图 - 图片来自于《美团点评技术团队文章》
更多录播视频+架构学习资料免费领取 QQ 2677509374
腾讯课堂 Android 高级架构系列免费直播公开课
https://ke.qq.com/course/341933?flowToken=1017873&taid=5402300059563949&tuin=7e87248a
2.问:您能说说 HashMap 常用操作的底层实现原理吗?如存储 put(K key, V value),查找
get(Object key),删除 remove(Object key),修改 replace(K key, V value)等操作。
答:调用 put(K key, V value)操作添加 key-value 键值对时,进行了如下操作:
判断哈希表 Node[] table 是否为空或者 null,是则执行 resize()
方法进行扩容。
根据插入的键值 key 的 hash 值,通过(n - 1) & hash 当前元素的 hash
值 & hash 表长度 - 1(实际就是 hash 值 % hash 表长度) 计算出存储位
置 table[i]。如果存储位置没有元素存放,则将新增结点存储在此位置
table[i]。
如果存储位置已经有键值对元素存在,则判断该位置元素的 hash 值和 key
值是否和当前操作元素一致,一致则证明是修改 value 操作,覆盖 value
即可。
当前存储位置即有元素,又不和当前操作元素一致,则证明此位置
table[i]已经发生了 hash 冲突,则通过判断头结点是否是 treeNode,如
果是 treeNode 则证明此位置的结构是红黑树,已红黑树的方式新增结点。
如果不是红黑树,则证明是单链表,将新增结点插入至链表的最后位置,
随后判断当前链表长度是否 大于等于 8,是则将当前存储位置的链表转
化为红黑树。遍历过程中如果发现 key 已经存在,则直接覆盖 value。
插入成功后,判断当前存储键值对的数量 大于 阈值 threshold 是则扩
容。
更多录播视频+架构学习资料免费领取 QQ 2677509374