logo资料库

Android中高级面试必知必会.pdf

第1页 / 共629页
第2页 / 共629页
第3页 / 共629页
第4页 / 共629页
第5页 / 共629页
第6页 / 共629页
第7页 / 共629页
第8页 / 共629页
资料共629页,剩余部分请下载后查看
腾讯课堂 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
分享到:
收藏