master e2139de7c710 cached
389 files
3.0 MB
800.9k tokens
695 symbols
1 requests
Download .txt
Showing preview only (3,192K chars total). Download the full file or copy to clipboard to get everything.
Repository: JackyAndroid/AndroidInterview-Q-A
Branch: master
Commit: e2139de7c710
Files: 389
Total size: 3.0 MB

Directory structure:
gitextract_5j775t_1/

├── .gitignore
├── .vuepress/
│   └── dist/
│       ├── 404.html
│       ├── assets/
│       │   ├── css/
│       │   │   └── 0.styles.33d1fe29.css
│       │   └── js/
│       │       ├── 10.9e736429.js
│       │       ├── 11.79dd85f0.js
│       │       ├── 12.73c7bb22.js
│       │       ├── 13.f677d7c4.js
│       │       ├── 14.f2b11944.js
│       │       ├── 15.38abfb77.js
│       │       ├── 16.3397fcb5.js
│       │       ├── 17.f8e05c59.js
│       │       ├── 18.98a9b878.js
│       │       ├── 19.5a8d7fbe.js
│       │       ├── 2.23124c79.js
│       │       ├── 20.8d6b010a.js
│       │       ├── 21.6c600605.js
│       │       ├── 22.c7ebece6.js
│       │       ├── 23.9b1d1cfc.js
│       │       ├── 24.489e8ac8.js
│       │       ├── 25.1d798f32.js
│       │       ├── 26.e477ad95.js
│       │       ├── 27.d297fac7.js
│       │       ├── 28.c36b0549.js
│       │       ├── 29.2f26e65a.js
│       │       ├── 3.888b2472.js
│       │       ├── 30.1c7e4986.js
│       │       ├── 31.32f7c857.js
│       │       ├── 32.a13ca202.js
│       │       ├── 33.90bf4621.js
│       │       ├── 34.bb5f949f.js
│       │       ├── 35.b283dac3.js
│       │       ├── 36.3032c4bb.js
│       │       ├── 37.6ff405bc.js
│       │       ├── 38.f6a52e06.js
│       │       ├── 39.7ce0a0f5.js
│       │       ├── 4.fe41294f.js
│       │       ├── 40.1662d618.js
│       │       ├── 41.2a812c43.js
│       │       ├── 42.5e53f08f.js
│       │       ├── 43.c4fa5c7d.js
│       │       ├── 44.ae8007c2.js
│       │       ├── 45.9cbb4e19.js
│       │       ├── 46.2249db82.js
│       │       ├── 47.1b41f358.js
│       │       ├── 48.387309f2.js
│       │       ├── 49.2316ffc9.js
│       │       ├── 5.b8a0041f.js
│       │       ├── 50.16f26c0e.js
│       │       ├── 51.ad1837d2.js
│       │       ├── 52.53997134.js
│       │       ├── 53.efacfabf.js
│       │       ├── 54.ec024a7e.js
│       │       ├── 55.90a5cae5.js
│       │       ├── 56.c99b5c22.js
│       │       ├── 57.99528377.js
│       │       ├── 58.e0be91a5.js
│       │       ├── 59.76323003.js
│       │       ├── 6.2e2bf07a.js
│       │       ├── 60.1fff84d3.js
│       │       ├── 61.d86a49ac.js
│       │       ├── 62.7b2b2166.js
│       │       ├── 63.3de4be6c.js
│       │       ├── 64.f177712d.js
│       │       ├── 65.a6025451.js
│       │       ├── 66.61b436f9.js
│       │       ├── 67.88898059.js
│       │       ├── 68.52455085.js
│       │       ├── 69.d4a08d30.js
│       │       ├── 7.e7997178.js
│       │       ├── 70.52acb40b.js
│       │       ├── 71.27515e96.js
│       │       ├── 72.0d8204b2.js
│       │       ├── 73.a431f4a6.js
│       │       ├── 74.e30eb438.js
│       │       ├── 75.6317c6b5.js
│       │       ├── 76.ec7c8c11.js
│       │       ├── 77.50e04b3f.js
│       │       ├── 78.759c37d0.js
│       │       ├── 79.dbecc3a8.js
│       │       ├── 8.a05ad03a.js
│       │       ├── 80.160ca675.js
│       │       ├── 9.981b483c.js
│       │       └── app.3c9e1f27.js
│       ├── index.html
│       └── source/
│           ├── index.html
│           └── interview/
│               ├── ==和equals和hashCode的区别-乐视.html
│               ├── ANR定位和修正.html
│               ├── AndroidService与Activity之间通信的几种方式.html
│               ├── Android为每个应用程序分配的内存大小是多少?-美团.html
│               ├── Android代码中实现WAP方式联网-360.html
│               ├── Android动画框架实现原理.html
│               ├── Android各个版本API的区别.html
│               ├── Android属性动画特性-乐视-小米.html
│               ├── ArrayMap对比HashMap.html
│               ├── ContentProvider-乐视.html
│               ├── Glide源码解析.html
│               ├── Handler消息处理.html
│               ├── HashMap的实现原理-美团.html
│               ├── LinearLayout对比RelativeLayout-百度.html
│               ├── Requestlayout,onlayout,onDraw,DrawChild区别与联系-猎豹.html
│               ├── Touch事件传递流程-小米.html
│               ├── Ubuntu编译安卓系统-百度.html
│               ├── activity-window-view三者的差别-fragment的特点-360.html
│               ├── fragment生命周期.html
│               ├── hashmap和hashtable的区别-乐视-小米.html
│               ├── index.html
│               ├── int-char-long各占多少字节数.html
│               ├── intentService作用是什么,AIDL解决了什么问题?-小米.html
│               ├── int与integer的区别.html
│               ├── invalidate和postInvalidate的区别及使用-百度.html
│               ├── java.html
│               ├── java多态-乐视.html
│               ├── java排序查找算法-美团.html
│               ├── java状态机.html
│               ├── launchmode应用场景-百度-小米-乐视.html
│               ├── string-stringbuffer-stringbuilder区别-小米-乐视-百度.html
│               ├── view绘制流程-百度.html
│               ├── volley解析-美团-乐视.html
│               ├── 什么导致线程阻塞-58-美团.html
│               ├── 什么情况导致oom-乐视-美团.html
│               ├── 什么情况导致内存泄漏-美团.html
│               ├── 优化自定义view百度-乐视-小米.html
│               ├── 低版本SDK实现高版本api-小米.html
│               ├── 内存模型.html
│               ├── 内部类.html
│               ├── 内部类的作用-乐视.html
│               ├── 列举java的集合和继承关系-百度-美团.html
│               ├── 哪些情况下的对象会被垃圾回收机制处理掉-美团-小米.html
│               ├── 图片.html
│               ├── 垃圾回收.html
│               ├── 多线程-360.html
│               ├── 如何保证service在后台不被kill.html
│               ├── 如何导入外部数据库-小米.html
│               ├── 容器类之间的区别-乐视-美团.html
│               ├── 常用Framework模块原理.html
│               ├── 并发编程-猎豹.html
│               ├── 性能优化.html
│               ├── 抽象类和接口-360.html
│               ├── 抽象类的意义-乐视.html
│               ├── 接口的意义-百度.html
│               ├── 描述一次网络请求的流程-新浪.html
│               ├── 插件化.html
│               ├── 数据库.html
│               ├── 本地广播和全局广播有什么差别.html
│               ├── 架构分析.html
│               ├── 架构设计-搜狐.html
│               ├── 泛型中extends和super的区别.html
│               ├── 深入研究的知识点.html
│               ├── 父类的静态方法能否被子类重写-猎豹.html
│               ├── 百度.html
│               ├── 算法.html
│               ├── 线程 线程池原理-腾讯.html
│               ├── 线程同步-百度.html
│               ├── 网络.html
│               ├── 腾讯.html
│               ├── 虚拟机-百度-乐视.html
│               ├── 设计模式.html
│               ├── 进程和线程的区别-猎豹-美团.html
│               ├── 进程间通讯机制Binder.html
│               └── 阿里巴巴.html
├── README.md
├── configs/
│   └── sorts.json
├── deploy.sh
├── docs/
│   ├── 404.html
│   ├── Android/
│   │   ├── ANR定位和修正.html
│   │   ├── AOP技术方案.html
│   │   ├── Apk打包流程.html
│   │   ├── ArrayMap对比HashMap.html
│   │   ├── Art Dalvik区别.html
│   │   ├── Binder原理.html
│   │   ├── ContentProvider-乐视.html
│   │   ├── Framework.html
│   │   ├── Glide源码解析.html
│   │   ├── Gradle.html
│   │   ├── Handler原理.html
│   │   ├── Kotlin.html
│   │   ├── LinearLayout对比RelativeLayout-百度.html
│   │   ├── RecyclerView缓存原理.html
│   │   ├── SP原理及优化.html
│   │   ├── Service与Activity之间通信的几种方式.html
│   │   ├── Touch事件传递流程-小米.html
│   │   ├── Ubuntu编译安卓系统-百度.html
│   │   ├── dex,odex,oat,vdex,art文件结构.html
│   │   ├── fragment生命周期.html
│   │   ├── index.html
│   │   ├── launchmode应用场景-百度-小米-乐视.html
│   │   ├── onSaveInstanceState原理.html
│   │   ├── view绘制流程-百度.html
│   │   ├── volley解析-美团-乐视.html
│   │   ├── 为什么不能使用Application Context显示 Dialog.html
│   │   ├── 什么情况导致oom-乐视-美团.html
│   │   ├── 什么情况导致内存泄漏-美团.html
│   │   ├── 动画框架实现原理.html
│   │   ├── 垃圾回收.html
│   │   ├── 屏幕刷新机制-腾讯.html
│   │   ├── 属性动画特性-乐视-小米.html
│   │   ├── 插件化.html
│   │   ├── 数据库.html
│   │   ├── 本地广播和全局广播有什么差别.html
│   │   ├── 架构范式.html
│   │   ├── 每个应用程序分配的内存大小是多少?-美团.html
│   │   ├── 注解处理器APT.html
│   │   ├── 渲染机制原理.html
│   │   └── 设计模式.html
│   ├── Java/
│   │   ├── ClassNotFoundException和NoClassDefFoundError的区别.html
│   │   ├── Exception 和 Error 有何区别?.html
│   │   ├── HashMap原理-美团.html
│   │   ├── JIT 编译器.html
│   │   ├── JavaBean HashCode怎么写.html
│   │   ├── LRUCache.html
│   │   ├── Wait、Sleep和Yield方法的区别.html
│   │   ├── hashmap和hashtable的区别-乐视-小米.html
│   │   ├── index.html
│   │   ├── 内存模型.html
│   │   ├── 列举java的集合和继承关系-百度-美团.html
│   │   ├── 动态代理.html
│   │   ├── 多态.html
│   │   ├── 大文件排序.html
│   │   ├── 容器类之间的区别-乐视-美团.html
│   │   ├── 泛型.html
│   │   ├── 父类的静态方法能否被子类重写-猎豹.html
│   │   ├── 线程&&线程池原理-腾讯.html
│   │   ├── 虚拟机-百度-乐视.html
│   │   ├── 进程和线程的区别-猎豹-美团.html
│   │   └── 锁&&并发.html
│   ├── assets/
│   │   ├── css/
│   │   │   └── 0.styles.aa90f834.css
│   │   └── js/
│   │       ├── 10.c2573781.js
│   │       ├── 11.ae832302.js
│   │       ├── 12.3343ef8e.js
│   │       ├── 13.5770262b.js
│   │       ├── 14.e70957ef.js
│   │       ├── 15.aa48ebad.js
│   │       ├── 16.48c282a5.js
│   │       ├── 17.83878a78.js
│   │       ├── 18.f413419c.js
│   │       ├── 19.858374d0.js
│   │       ├── 2.9b17f659.js
│   │       ├── 20.52095afd.js
│   │       ├── 21.aacaa098.js
│   │       ├── 22.d5fe6804.js
│   │       ├── 23.f7343788.js
│   │       ├── 24.d281157a.js
│   │       ├── 25.1c160e8c.js
│   │       ├── 26.5120699f.js
│   │       ├── 27.699515ad.js
│   │       ├── 28.876150cf.js
│   │       ├── 29.ee8cd5bf.js
│   │       ├── 3.8be43c93.js
│   │       ├── 30.714ef1cd.js
│   │       ├── 31.88fa871a.js
│   │       ├── 32.f032c410.js
│   │       ├── 33.a911dcef.js
│   │       ├── 34.2aabf7dc.js
│   │       ├── 35.1cdad8e8.js
│   │       ├── 36.2c4b17cd.js
│   │       ├── 37.1c5cf1ee.js
│   │       ├── 38.12af5809.js
│   │       ├── 39.85f91710.js
│   │       ├── 4.ff57f142.js
│   │       ├── 40.bb76f148.js
│   │       ├── 41.000bfe72.js
│   │       ├── 42.026c4ae3.js
│   │       ├── 43.a64d3d9d.js
│   │       ├── 44.92abeb4c.js
│   │       ├── 45.5b266982.js
│   │       ├── 46.2308134c.js
│   │       ├── 47.bb79218f.js
│   │       ├── 48.1c9fc7d5.js
│   │       ├── 49.61ac7bc9.js
│   │       ├── 5.082bf8bb.js
│   │       ├── 50.1885cbd0.js
│   │       ├── 51.cd45fdff.js
│   │       ├── 52.e9466cf7.js
│   │       ├── 53.6937ae5b.js
│   │       ├── 54.eb2ead99.js
│   │       ├── 55.acc92e1e.js
│   │       ├── 56.c6f6eeff.js
│   │       ├── 57.48c68b3e.js
│   │       ├── 58.a2543ba2.js
│   │       ├── 59.8f479c38.js
│   │       ├── 6.a76c0e23.js
│   │       ├── 60.fc4f75b0.js
│   │       ├── 61.b1c46878.js
│   │       ├── 62.fff21d87.js
│   │       ├── 63.9d3d8477.js
│   │       ├── 64.010d135d.js
│   │       ├── 65.6cbce77c.js
│   │       ├── 66.fdfbb9d1.js
│   │       ├── 67.7715276d.js
│   │       ├── 68.3ef20b75.js
│   │       ├── 69.23899484.js
│   │       ├── 7.71d197a6.js
│   │       ├── 70.9e608dec.js
│   │       ├── 71.acaba3e2.js
│   │       ├── 72.fbae8ba4.js
│   │       ├── 73.d2cbdd12.js
│   │       ├── 74.a9217ec5.js
│   │       ├── 75.1d694460.js
│   │       ├── 76.3e60f4da.js
│   │       ├── 77.1589c405.js
│   │       ├── 8.fa989ad9.js
│   │       ├── 9.8106ef0a.js
│   │       └── app.e169f4c1.js
│   ├── index.html
│   ├── tencent13978746047597349090.txt
│   └── 专题/
│       ├── index.html
│       ├── 图片.html
│       ├── 性能优化.html
│       ├── 深入研究的知识点.html
│       ├── 百度.html
│       ├── 算法.html
│       ├── 网络.html
│       ├── 腾讯.html
│       └── 阿里巴巴.html
├── package.json
├── source/
│   ├── .vuepress/
│   │   ├── config.js
│   │   └── nav.js
│   ├── Android/
│   │   ├── ANR定位和修正.md
│   │   ├── AOP技术方案.md
│   │   ├── Apk打包流程.md
│   │   ├── ArrayMap对比HashMap.md
│   │   ├── Art Dalvik区别.md
│   │   ├── Binder原理.md
│   │   ├── ContentProvider-乐视.md
│   │   ├── Framework.md
│   │   ├── Glide源码解析.md
│   │   ├── Gradle.md
│   │   ├── Handler原理.md
│   │   ├── Kotlin.md
│   │   ├── LinearLayout对比RelativeLayout-百度.md
│   │   ├── README.md
│   │   ├── RecyclerView缓存原理.md
│   │   ├── SP原理及优化.md
│   │   ├── Service与Activity之间通信的几种方式.md
│   │   ├── Touch事件传递流程-小米.md
│   │   ├── Ubuntu编译安卓系统-百度.md
│   │   ├── dex,odex,oat,vdex,art文件结构.md
│   │   ├── fragment生命周期.md
│   │   ├── launchmode应用场景-百度-小米-乐视.md
│   │   ├── onSaveInstanceState原理.md
│   │   ├── view绘制流程-百度.md
│   │   ├── volley解析-美团-乐视.md
│   │   ├── 为什么不能使用Application Context显示 Dialog.md
│   │   ├── 什么情况导致oom-乐视-美团.md
│   │   ├── 什么情况导致内存泄漏-美团.md
│   │   ├── 动画框架实现原理.md
│   │   ├── 垃圾回收.md
│   │   ├── 屏幕刷新机制-腾讯.md
│   │   ├── 属性动画特性-乐视-小米.md
│   │   ├── 插件化.md
│   │   ├── 数据库.md
│   │   ├── 本地广播和全局广播有什么差别.md
│   │   ├── 架构范式.md
│   │   ├── 每个应用程序分配的内存大小是多少?-美团.md
│   │   ├── 注解处理器APT.md
│   │   ├── 渲染机制原理.md
│   │   └── 设计模式.md
│   ├── Java/
│   │   ├── ClassNotFoundException和NoClassDefFoundError的区别.md
│   │   ├── Exception 和 Error 有何区别?.md
│   │   ├── HashMap原理-美团.md
│   │   ├── JIT 编译器.md
│   │   ├── JavaBean HashCode怎么写.md
│   │   ├── LRUCache.md
│   │   ├── Wait、Sleep和Yield方法的区别.md
│   │   ├── hashmap和hashtable的区别-乐视-小米.md
│   │   ├── 内存模型.md
│   │   ├── 列举java的集合和继承关系-百度-美团.md
│   │   ├── 动态代理.md
│   │   ├── 多态.md
│   │   ├── 大文件排序.md
│   │   ├── 容器类之间的区别-乐视-美团.md
│   │   ├── 泛型.md
│   │   ├── 父类的静态方法能否被子类重写-猎豹.md
│   │   ├── 线程&&线程池原理-腾讯.md
│   │   ├── 虚拟机-百度-乐视.md
│   │   ├── 进程和线程的区别-猎豹-美团.md
│   │   └── 锁&&并发.md
│   ├── README.md
│   ├── java/
│   │   └── README.md
│   └── 专题/
│       ├── README.md
│       ├── 图片.md
│       ├── 性能优化.md
│       ├── 深入研究的知识点.md
│       ├── 百度.md
│       ├── 算法.md
│       ├── 网络.md
│       ├── 腾讯.md
│       └── 阿里巴巴.md
└── tencent13978746047597349090.txt

================================================
FILE CONTENTS
================================================

================================================
FILE: .gitignore
================================================
.sync/*

.me_configs.data

.z_sync_configs.data

sync_changes.log

sync_hook.script

**/.Archive

node_modules/

================================================
FILE: .vuepress/dist/404.html
================================================
<!DOCTYPE html>
<html lang="en-US">
  <head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width,initial-scale=1">
    <title>VuePress</title>
    <meta name="description" content="">
    
    
    <link rel="preload" href="/assets/css/0.styles.33d1fe29.css" as="style"><link rel="preload" href="/assets/js/app.3c9e1f27.js" as="script"><link rel="prefetch" href="/assets/js/2.23124c79.js"><link rel="prefetch" href="/assets/js/3.888b2472.js"><link rel="prefetch" href="/assets/js/4.fe41294f.js"><link rel="prefetch" href="/assets/js/5.b8a0041f.js"><link rel="prefetch" href="/assets/js/6.2e2bf07a.js"><link rel="prefetch" href="/assets/js/7.e7997178.js"><link rel="prefetch" href="/assets/js/8.a05ad03a.js"><link rel="prefetch" href="/assets/js/9.981b483c.js"><link rel="prefetch" href="/assets/js/10.9e736429.js"><link rel="prefetch" href="/assets/js/11.79dd85f0.js"><link rel="prefetch" href="/assets/js/12.73c7bb22.js"><link rel="prefetch" href="/assets/js/13.f677d7c4.js"><link rel="prefetch" href="/assets/js/14.f2b11944.js"><link rel="prefetch" href="/assets/js/15.38abfb77.js"><link rel="prefetch" href="/assets/js/16.3397fcb5.js"><link rel="prefetch" href="/assets/js/17.f8e05c59.js"><link rel="prefetch" href="/assets/js/18.98a9b878.js"><link rel="prefetch" href="/assets/js/19.5a8d7fbe.js"><link rel="prefetch" href="/assets/js/20.8d6b010a.js"><link rel="prefetch" href="/assets/js/21.6c600605.js"><link rel="prefetch" href="/assets/js/22.c7ebece6.js"><link rel="prefetch" href="/assets/js/23.9b1d1cfc.js"><link rel="prefetch" href="/assets/js/24.489e8ac8.js"><link rel="prefetch" href="/assets/js/25.1d798f32.js"><link rel="prefetch" href="/assets/js/26.e477ad95.js"><link rel="prefetch" href="/assets/js/27.d297fac7.js"><link rel="prefetch" href="/assets/js/28.c36b0549.js"><link rel="prefetch" href="/assets/js/29.2f26e65a.js"><link rel="prefetch" href="/assets/js/30.1c7e4986.js"><link rel="prefetch" href="/assets/js/31.32f7c857.js"><link rel="prefetch" href="/assets/js/32.a13ca202.js"><link rel="prefetch" href="/assets/js/33.90bf4621.js"><link rel="prefetch" href="/assets/js/34.bb5f949f.js"><link rel="prefetch" href="/assets/js/35.b283dac3.js"><link rel="prefetch" href="/assets/js/36.3032c4bb.js"><link rel="prefetch" href="/assets/js/37.6ff405bc.js"><link rel="prefetch" href="/assets/js/38.f6a52e06.js"><link rel="prefetch" href="/assets/js/39.7ce0a0f5.js"><link rel="prefetch" href="/assets/js/40.1662d618.js"><link rel="prefetch" href="/assets/js/41.2a812c43.js"><link rel="prefetch" href="/assets/js/42.5e53f08f.js"><link rel="prefetch" href="/assets/js/43.c4fa5c7d.js"><link rel="prefetch" href="/assets/js/44.ae8007c2.js"><link rel="prefetch" href="/assets/js/45.9cbb4e19.js"><link rel="prefetch" href="/assets/js/46.2249db82.js"><link rel="prefetch" href="/assets/js/47.1b41f358.js"><link rel="prefetch" href="/assets/js/48.387309f2.js"><link rel="prefetch" href="/assets/js/49.2316ffc9.js"><link rel="prefetch" href="/assets/js/50.16f26c0e.js"><link rel="prefetch" href="/assets/js/51.ad1837d2.js"><link rel="prefetch" href="/assets/js/52.53997134.js"><link rel="prefetch" href="/assets/js/53.efacfabf.js"><link rel="prefetch" href="/assets/js/54.ec024a7e.js"><link rel="prefetch" href="/assets/js/55.90a5cae5.js"><link rel="prefetch" href="/assets/js/56.c99b5c22.js"><link rel="prefetch" href="/assets/js/57.99528377.js"><link rel="prefetch" href="/assets/js/58.e0be91a5.js"><link rel="prefetch" href="/assets/js/59.76323003.js"><link rel="prefetch" href="/assets/js/60.1fff84d3.js"><link rel="prefetch" href="/assets/js/61.d86a49ac.js"><link rel="prefetch" href="/assets/js/62.7b2b2166.js"><link rel="prefetch" href="/assets/js/63.3de4be6c.js"><link rel="prefetch" href="/assets/js/64.f177712d.js"><link rel="prefetch" href="/assets/js/65.a6025451.js"><link rel="prefetch" href="/assets/js/66.61b436f9.js"><link rel="prefetch" href="/assets/js/67.88898059.js"><link rel="prefetch" href="/assets/js/68.52455085.js"><link rel="prefetch" href="/assets/js/69.d4a08d30.js"><link rel="prefetch" href="/assets/js/70.52acb40b.js"><link rel="prefetch" href="/assets/js/71.27515e96.js"><link rel="prefetch" href="/assets/js/72.0d8204b2.js"><link rel="prefetch" href="/assets/js/73.a431f4a6.js"><link rel="prefetch" href="/assets/js/74.e30eb438.js"><link rel="prefetch" href="/assets/js/75.6317c6b5.js"><link rel="prefetch" href="/assets/js/76.ec7c8c11.js"><link rel="prefetch" href="/assets/js/77.50e04b3f.js"><link rel="prefetch" href="/assets/js/78.759c37d0.js"><link rel="prefetch" href="/assets/js/79.dbecc3a8.js"><link rel="prefetch" href="/assets/js/80.160ca675.js">
    <link rel="stylesheet" href="/assets/css/0.styles.33d1fe29.css">
  </head>
  <body>
    <div id="app" data-server-rendered="true"><div class="theme-container"><div class="content"><h1>404</h1> <blockquote>That's a Four-Oh-Four.</blockquote> <a href="/" class="router-link-active">Take me home.</a></div></div></div>
    <script src="/assets/js/app.3c9e1f27.js" defer></script>
  </body>
</html>


================================================
FILE: .vuepress/dist/assets/css/0.styles.33d1fe29.css
================================================
.home{padding:3.6rem 2rem 0;max-width:960px;margin:0 auto}.home .hero{text-align:center}.home .hero img{max-height:280px;display:block;margin:3rem auto 1.5rem}.home .hero h1{font-size:3rem}.home .hero .action,.home .hero .description,.home .hero h1{margin:1.8rem auto}.home .hero .description{max-width:35rem;font-size:1.6rem;line-height:1.3;color:#6a8bad}.home .hero .action-button{display:inline-block;font-size:1.2rem;color:#fff;background-color:#3eaf7c;padding:.8rem 1.6rem;border-radius:4px;transition:background-color .1s ease;box-sizing:border-box;border-bottom:1px solid #389d70}.home .hero .action-button:hover{background-color:#4abf8a}.home .features{border-top:1px solid #eaecef;padding:1.2rem 0;margin-top:2.5rem;display:flex;flex-wrap:wrap;align-items:flex-start;align-content:stretch;justify-content:space-between}.home .feature{flex-grow:1;flex-basis:30%;max-width:30%}.home .feature h2{font-size:1.4rem;font-weight:500;border-bottom:none;padding-bottom:0;color:#3a5169}.home .feature p{color:#4e6e8e}.home .footer{padding:2.5rem;border-top:1px solid #eaecef;text-align:center;color:#4e6e8e}@media (max-width:719px){.home .features{flex-direction:column}.home .feature{max-width:100%;padding:0 2.5rem}}@media (max-width:419px){.home{padding-left:1.5rem;padding-right:1.5rem}.home .hero img{max-height:210px;margin:2rem auto 1.2rem}.home .hero h1{font-size:2rem}.home .hero .action,.home .hero .description,.home .hero h1{margin:1.2rem auto}.home .hero .description{font-size:1.2rem}.home .hero .action-button{font-size:1rem;padding:.6rem 1.2rem}.home .feature h2{font-size:1.25rem}}.sidebar-button{display:none;width:1.25rem;height:1.25rem;position:absolute;padding:.6rem;top:.6rem;left:1rem}.sidebar-button .icon{display:block;width:1.25rem;height:1.25rem}@media (max-width:719px){.sidebar-button{display:block}}.search-box{display:inline-block;position:relative;margin-right:1rem}.search-box input{cursor:text;width:10rem;color:#4e6e8e;display:inline-block;border:1px solid #cfd4db;border-radius:2rem;font-size:.9rem;line-height:2rem;padding:0 .5rem 0 2rem;outline:none;transition:all .2s ease;background:#fff url(/assets/img/search.83621669.svg) .6rem .5rem no-repeat;background-size:1rem}.search-box input:focus{cursor:auto;border-color:#3eaf7c}.search-box .suggestions{background:#fff;width:20rem;position:absolute;top:1.5rem;border:1px solid #cfd4db;border-radius:6px;padding:.4rem;list-style-type:none}.search-box .suggestions.align-right{right:0}.search-box .suggestion{line-height:1.4;padding:.4rem .6rem;border-radius:4px;cursor:pointer}.search-box .suggestion a{white-space:normal;color:#5d82a6}.search-box .suggestion a .page-title{font-weight:600}.search-box .suggestion a .header{font-size:.9em;margin-left:.25em}.search-box .suggestion.focused{background-color:#f3f4f5}.search-box .suggestion.focused a{color:#3eaf7c}@media (max-width:959px){.search-box input{cursor:pointer;width:0;border-color:transparent;position:relative}.search-box input:focus{cursor:text;left:0;width:10rem}}@media (max-width:959px) and (min-width:719px){.search-box .suggestions{left:0}}@media (max-width:719px){.search-box{margin-right:0}.search-box input{left:1rem}.search-box .suggestions{right:0}}@media (max-width:419px){.search-box .suggestions{width:calc(100vw - 4rem)}.search-box input:focus{width:8rem}}.dropdown-enter,.dropdown-leave-to{height:0!important}.dropdown-wrapper{cursor:pointer}.dropdown-wrapper .dropdown-title{display:block}.dropdown-wrapper .dropdown-title:hover{border-color:transparent}.dropdown-wrapper .dropdown-title .arrow{vertical-align:middle;margin-top:-1px;margin-left:.4rem}.dropdown-wrapper .nav-dropdown .dropdown-item{color:inherit;line-height:1.7rem}.dropdown-wrapper .nav-dropdown .dropdown-item h4{margin:.45rem 0 0;border-top:1px solid #eee;padding:.45rem 1.5rem 0 1.25rem}.dropdown-wrapper .nav-dropdown .dropdown-item .dropdown-subitem-wrapper{padding:0;list-style:none}.dropdown-wrapper .nav-dropdown .dropdown-item .dropdown-subitem-wrapper .dropdown-subitem{font-size:.9em}.dropdown-wrapper .nav-dropdown .dropdown-item a{display:block;line-height:1.7rem;position:relative;border-bottom:none;font-weight:400;margin-bottom:0;padding:0 1.5rem 0 1.25rem}.dropdown-wrapper .nav-dropdown .dropdown-item a.router-link-active,.dropdown-wrapper .nav-dropdown .dropdown-item a:hover{color:#3eaf7c}.dropdown-wrapper .nav-dropdown .dropdown-item a.router-link-active:after{content:"";width:0;height:0;border-left:5px solid #3eaf7c;border-top:3px solid transparent;border-bottom:3px solid transparent;position:absolute;top:calc(50% - 2px);left:9px}.dropdown-wrapper .nav-dropdown .dropdown-item:first-child h4{margin-top:0;padding-top:0;border-top:0}@media (max-width:719px){.dropdown-wrapper.open .dropdown-title{margin-bottom:.5rem}.dropdown-wrapper .nav-dropdown{transition:height .1s ease-out;overflow:hidden}.dropdown-wrapper .nav-dropdown .dropdown-item h4{border-top:0;margin-top:0;padding-top:0}.dropdown-wrapper .nav-dropdown .dropdown-item>a,.dropdown-wrapper .nav-dropdown .dropdown-item h4{font-size:15px;line-height:2rem}.dropdown-wrapper .nav-dropdown .dropdown-item .dropdown-subitem{font-size:14px;padding-left:1rem}}@media (min-width:719px){.dropdown-wrapper{height:1.8rem}.dropdown-wrapper:hover .nav-dropdown{display:block!important}.dropdown-wrapper .dropdown-title .arrow{border-left:4px solid transparent;border-right:4px solid transparent;border-top:6px solid #ccc;border-bottom:0}.dropdown-wrapper .nav-dropdown{display:none;height:auto!important;box-sizing:border-box;max-height:calc(100vh - 2.7rem);overflow-y:auto;position:absolute;top:100%;right:0;background-color:#fff;padding:.6rem 0;border:1px solid #ddd;border-bottom-color:#ccc;text-align:left;border-radius:.25rem;white-space:nowrap;margin:0}}.nav-links{display:inline-block}.nav-links a{line-height:1.4rem;color:inherit}.nav-links a.router-link-active,.nav-links a:hover{color:#3eaf7c}.nav-links .nav-item{position:relative;display:inline-block;margin-left:1.5rem;line-height:2rem}.nav-links .nav-item:first-child{margin-left:0}.nav-links .repo-link{margin-left:1.5rem}@media (max-width:719px){.nav-links .nav-item,.nav-links .repo-link{margin-left:0}}@media (min-width:719px){.nav-links a.router-link-active,.nav-links a:hover{color:#2c3e50}.nav-item>a:not(.external).router-link-active,.nav-item>a:not(.external):hover{margin-bottom:-2px;border-bottom:2px solid #46bd87}}.navbar{padding:.7rem 1.5rem;line-height:2.2rem;position:relative}.navbar a,.navbar img,.navbar span{display:inline-block}.navbar .logo{height:2.2rem;min-width:2.2rem;margin-right:.8rem;vertical-align:top}.navbar .site-name{font-size:1.3rem;font-weight:600;color:#2c3e50;position:relative}.navbar .links{padding-left:1.5rem;box-sizing:border-box;background-color:#fff;white-space:nowrap;font-size:.9rem;position:absolute;right:1.5rem;top:.7rem;display:flex}.navbar .links .search-box{flex:0 0 auto;vertical-align:top}.navbar .links .nav-links{flex:1}@media (max-width:719px){.navbar{padding-left:4rem}.navbar .can-hide{display:none}.navbar .links{padding-left:1.5rem}}.page-edit,.page-nav{max-width:740px;margin:0 auto;padding:2rem 2.5rem}@media (max-width:959px){.page-edit,.page-nav{padding:2rem}}@media (max-width:419px){.page-edit,.page-nav{padding:1.5rem}}.page{padding-bottom:2rem}.page-edit{padding-top:1rem;padding-bottom:1rem;overflow:auto}.page-edit .edit-link{display:inline-block}.page-edit .edit-link a{color:#4e6e8e;margin-right:.25rem}.page-edit .last-updated{float:right;font-size:.9em}.page-edit .last-updated .prefix{font-weight:500;color:#4e6e8e}.page-edit .last-updated .time{font-weight:400;color:#aaa}.page-nav{padding-top:1rem;padding-bottom:0}.page-nav .inner{min-height:2rem;margin-top:0;border-top:1px solid #eaecef;padding-top:1rem;overflow:auto}.page-nav .next{float:right}@media (max-width:719px){.page-edit .edit-link{margin-bottom:.5rem}.page-edit .last-updated{font-size:.8em;float:none;text-align:left}}.sidebar .sidebar-sub-headers{padding-left:1rem;font-size:.95em}a.sidebar-link{font-weight:400;display:inline-block;color:#2c3e50;border-left:.25rem solid transparent;padding:.35rem 1rem .35rem 1.25rem;line-height:1.4;width:100%;box-sizing:border-box}a.sidebar-link:hover{color:#3eaf7c}a.sidebar-link.active{font-weight:600;color:#3eaf7c;border-left-color:#3eaf7c}.sidebar-group a.sidebar-link{padding-left:2rem}.sidebar-sub-headers a.sidebar-link{padding-top:.25rem;padding-bottom:.25rem;border-left:none}.sidebar-sub-headers a.sidebar-link.active{font-weight:500}.sidebar-group:not(.first){margin-top:1em}.sidebar-group .sidebar-group{padding-left:.5em}.sidebar-group:not(.collapsable) .sidebar-heading{cursor:auto;color:inherit}.sidebar-heading{color:#999;transition:color .15s ease;cursor:pointer;font-size:1.1em;font-weight:700;padding:0 1.5rem;margin-top:0;margin-bottom:.5rem}.sidebar-heading.open,.sidebar-heading:hover{color:inherit}.sidebar-heading .arrow{position:relative;top:-.12em;left:.5em}.sidebar-heading:.open .arrow{top:-.18em}.sidebar-group-items{transition:height .1s ease-out;overflow:hidden}.sidebar ul{padding:0;margin:0;list-style-type:none}.sidebar a{display:inline-block}.sidebar .nav-links{display:none;border-bottom:1px solid #eaecef;padding:.5rem 0 .75rem 0}.sidebar .nav-links a{font-weight:600}.sidebar .nav-links .nav-item,.sidebar .nav-links .repo-link{display:block;line-height:1.25rem;font-size:1.1em;padding:.5rem 0 .5rem 1.5rem}.sidebar .sidebar-links{padding:1.5rem 0}@media (max-width:719px){.sidebar .nav-links{display:block}.sidebar .nav-links .dropdown-wrapper .nav-dropdown .dropdown-item a.router-link-active:after{top:calc(1rem - 2px)}.sidebar .sidebar-links{padding:1rem 0}}.sw-update-popup{position:fixed;right:1em;bottom:1em;padding:1em;border:1px solid #3eaf7c;border-radius:3px;background:#fff;box-shadow:0 4px 16px rgba(0,0,0,.5);text-align:center}.sw-update-popup button{margin-top:.5em;padding:.25em 2em}.sw-update-popup-enter-active,.sw-update-popup-leave-active{transition:opacity .3s,transform .3s}.sw-update-popup-enter,.sw-update-popup-leave-to{opacity:0;transform:translateY(50%) scale(.5)}code[class*=language-],pre[class*=language-]{color:#ccc;background:none;font-family:Consolas,Monaco,Andale Mono,Ubuntu Mono,monospace;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;line-height:1.5;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-hyphens:none;-ms-hyphens:none;hyphens:none}pre[class*=language-]{padding:1em;margin:.5em 0;overflow:auto}:not(pre)>code[class*=language-],pre[class*=language-]{background:#2d2d2d}:not(pre)>code[class*=language-]{padding:.1em;border-radius:.3em;white-space:normal}.token.block-comment,.token.cdata,.token.comment,.token.doctype,.token.prolog{color:#999}.token.punctuation{color:#ccc}.token.attr-name,.token.deleted,.token.namespace,.token.tag{color:#e2777a}.token.function-name{color:#6196cc}.token.boolean,.token.function,.token.number{color:#f08d49}.token.class-name,.token.constant,.token.property,.token.symbol{color:#f8c555}.token.atrule,.token.builtin,.token.important,.token.keyword,.token.selector{color:#cc99cd}.token.attr-value,.token.char,.token.regex,.token.string,.token.variable{color:#7ec699}.token.entity,.token.operator,.token.url{color:#67cdcc}.token.bold,.token.important{font-weight:700}.token.italic{font-style:italic}.token.entity{cursor:help}.token.inserted{color:green}#nprogress{pointer-events:none}#nprogress .bar{background:#3eaf7c;position:fixed;z-index:1031;top:0;left:0;width:100%;height:2px}#nprogress .peg{display:block;position:absolute;right:0;width:100px;height:100%;box-shadow:0 0 10px #3eaf7c,0 0 5px #3eaf7c;opacity:1;transform:rotate(3deg) translateY(-4px)}#nprogress .spinner{display:block;position:fixed;z-index:1031;top:15px;right:15px}#nprogress .spinner-icon{width:18px;height:18px;box-sizing:border-box;border:2px solid transparent;border-top-color:#3eaf7c;border-left-color:#3eaf7c;border-radius:50%;animation:nprogress-spinner .4s linear infinite}.nprogress-custom-parent{overflow:hidden;position:relative}.nprogress-custom-parent #nprogress .bar,.nprogress-custom-parent #nprogress .spinner{position:absolute}@keyframes nprogress-spinner{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}.content code{color:#476582;padding:.25rem .5rem;margin:0;font-size:.85em;background-color:rgba(27,31,35,.05);border-radius:3px}.content pre,.content pre[class*=language-]{line-height:1.4;padding:1.25rem 1.5rem;margin:.85rem 0;background-color:#282c34;border-radius:6px;overflow:auto}.content pre[class*=language-] code,.content pre code{color:#fff;padding:0;background-color:transparent;border-radius:0}div[class*=language-]{position:relative;background-color:#282c34;border-radius:6px}div[class*=language-] .highlight-lines{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;padding-top:1.3rem;position:absolute;top:0;left:0;width:100%;line-height:1.4}div[class*=language-] .highlight-lines .highlighted{background-color:rgba(0,0,0,.66)}div[class*=language-] pre,div[class*=language-] pre[class*=language-]{background:transparent;position:relative;z-index:1}div[class*=language-]:before{position:absolute;z-index:3;top:.8em;right:1em;font-size:.75rem;color:hsla(0,0%,100%,.4)}div[class*=language-]:not(.line-numbers-mode) .line-numbers-wrapper{display:none}div[class*=language-].line-numbers-mode .highlight-lines .highlighted{position:relative}div[class*=language-].line-numbers-mode .highlight-lines .highlighted:before{content:" ";position:absolute;z-index:3;left:0;top:0;display:block;width:3.5rem;height:100%;background-color:rgba(0,0,0,.66)}div[class*=language-].line-numbers-mode pre{padding-left:4.5rem;vertical-align:middle}div[class*=language-].line-numbers-mode .line-numbers-wrapper{position:absolute;top:0;width:3.5rem;text-align:center;color:hsla(0,0%,100%,.3);padding:1.25rem 0;line-height:1.4}div[class*=language-].line-numbers-mode .line-numbers-wrapper .line-number,div[class*=language-].line-numbers-mode .line-numbers-wrapper br{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}div[class*=language-].line-numbers-mode .line-numbers-wrapper .line-number{position:relative;z-index:4;font-size:.85em}div[class*=language-].line-numbers-mode:after{content:"";position:absolute;z-index:2;top:0;left:0;width:3.5rem;height:100%;border-radius:6px 0 0 6px;border-right:1px solid rgba(0,0,0,.66);background-color:#282c34}div[class~=language-js]:before{content:"js"}div[class~=language-ts]:before{content:"ts"}div[class~=language-html]:before{content:"html"}div[class~=language-md]:before{content:"md"}div[class~=language-vue]:before{content:"vue"}div[class~=language-css]:before{content:"css"}div[class~=language-sass]:before{content:"sass"}div[class~=language-scss]:before{content:"scss"}div[class~=language-less]:before{content:"less"}div[class~=language-stylus]:before{content:"stylus"}div[class~=language-go]:before{content:"go"}div[class~=language-java]:before{content:"java"}div[class~=language-c]:before{content:"c"}div[class~=language-sh]:before{content:"sh"}div[class~=language-yaml]:before{content:"yaml"}div[class~=language-py]:before{content:"py"}div[class~=language-javascript]:before{content:"js"}div[class~=language-typescript]:before{content:"ts"}div[class~=language-markup]:before{content:"html"}div[class~=language-markdown]:before{content:"md"}div[class~=language-json]:before{content:"json"}div[class~=language-ruby]:before{content:"rb"}div[class~=language-python]:before{content:"py"}div[class~=language-bash]:before{content:"sh"}.custom-block .custom-block-title{font-weight:600;margin-bottom:-.4rem}.custom-block.danger,.custom-block.tip,.custom-block.warning{padding:.1rem 1.5rem;border-left-width:.5rem;border-left-style:solid;margin:1rem 0}.custom-block.tip{background-color:#f3f5f7;border-color:#42b983}.custom-block.warning{background-color:rgba(255,229,100,.3);border-color:#e7c000;color:#6b5900}.custom-block.warning .custom-block-title{color:#b29400}.custom-block.warning a{color:#2c3e50}.custom-block.danger{background-color:#ffe6e6;border-color:#c00;color:#4d0000}.custom-block.danger .custom-block-title{color:#900}.custom-block.danger a{color:#2c3e50}.arrow{display:inline-block;width:0;height:0}.arrow.up{border-bottom:6px solid #ccc}.arrow.down,.arrow.up{border-left:4px solid transparent;border-right:4px solid transparent}.arrow.down{border-top:6px solid #ccc}.arrow.right{border-left:6px solid #ccc}.arrow.left,.arrow.right{border-top:4px solid transparent;border-bottom:4px solid transparent}.arrow.left{border-right:6px solid #ccc}.content:not(.custom){max-width:740px;margin:0 auto;padding:2rem 2.5rem}@media (max-width:959px){.content:not(.custom){padding:2rem}}@media (max-width:419px){.content:not(.custom){padding:1.5rem}}.table-of-contents .badge{vertical-align:middle}body,html{padding:0;margin:0}body{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,Fira Sans,Droid Sans,Helvetica Neue,sans-serif;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;font-size:16px;color:#2c3e50}.page{padding-left:20rem}.navbar{z-index:20;right:0;height:3.6rem;background-color:#fff;box-sizing:border-box;border-bottom:1px solid #eaecef}.navbar,.sidebar-mask{position:fixed;top:0;left:0}.sidebar-mask{z-index:9;width:100vw;height:100vh;display:none}.sidebar{font-size:15px;background-color:#fff;width:20rem;position:fixed;z-index:10;margin:0;top:3.6rem;left:0;bottom:0;box-sizing:border-box;border-right:1px solid #eaecef;overflow-y:auto}.content:not(.custom)>:first-child{margin-top:3.6rem}.content:not(.custom) a:hover{text-decoration:underline}.content:not(.custom) p.demo{padding:1rem 1.5rem;border:1px solid #ddd;border-radius:4px}.content:not(.custom) img{max-width:100%}.content.custom{padding:0;margin:0}.content.custom img{max-width:100%}a{font-weight:500;text-decoration:none}a,p a code{color:#3eaf7c}p a code{font-weight:400}kbd{background:#eee;border:.15rem solid #ddd;border-bottom:.25rem solid #ddd;border-radius:.15rem;padding:0 .15em}blockquote{font-size:1.2rem;color:#999;border-left:.25rem solid #dfe2e5;margin-left:0;padding-left:1rem}ol,ul{padding-left:1.2em}strong{font-weight:600}h1,h2,h3,h4,h5,h6{font-weight:600;line-height:1.25}.content:not(.custom)>h1,.content:not(.custom)>h2,.content:not(.custom)>h3,.content:not(.custom)>h4,.content:not(.custom)>h5,.content:not(.custom)>h6{margin-top:-3.1rem;padding-top:4.6rem;margin-bottom:0}.content:not(.custom)>h1:first-child,.content:not(.custom)>h2:first-child,.content:not(.custom)>h3:first-child,.content:not(.custom)>h4:first-child,.content:not(.custom)>h5:first-child,.content:not(.custom)>h6:first-child{margin-top:-1.5rem;margin-bottom:1rem}.content:not(.custom)>h1:first-child+.custom-block,.content:not(.custom)>h1:first-child+p,.content:not(.custom)>h1:first-child+pre,.content:not(.custom)>h2:first-child+.custom-block,.content:not(.custom)>h2:first-child+p,.content:not(.custom)>h2:first-child+pre,.content:not(.custom)>h3:first-child+.custom-block,.content:not(.custom)>h3:first-child+p,.content:not(.custom)>h3:first-child+pre,.content:not(.custom)>h4:first-child+.custom-block,.content:not(.custom)>h4:first-child+p,.content:not(.custom)>h4:first-child+pre,.content:not(.custom)>h5:first-child+.custom-block,.content:not(.custom)>h5:first-child+p,.content:not(.custom)>h5:first-child+pre,.content:not(.custom)>h6:first-child+.custom-block,.content:not(.custom)>h6:first-child+p,.content:not(.custom)>h6:first-child+pre{margin-top:2rem}h1:hover .header-anchor,h2:hover .header-anchor,h3:hover .header-anchor,h4:hover .header-anchor,h5:hover .header-anchor,h6:hover .header-anchor{opacity:1}h1{font-size:2.2rem}h2{font-size:1.65rem;padding-bottom:.3rem;border-bottom:1px solid #eaecef}h3{font-size:1.35rem}a.header-anchor{font-size:.85em;float:left;margin-left:-.87em;padding-right:.23em;margin-top:.125em;opacity:0}a.header-anchor:hover{text-decoration:none}.line-number,code,kbd{font-family:source-code-pro,Menlo,Monaco,Consolas,Courier New,monospace}ol,p,ul{line-height:1.7}hr{border:0;border-top:1px solid #eaecef}table{border-collapse:collapse;margin:1rem 0;display:block;overflow-x:auto}tr{border-top:1px solid #dfe2e5}tr:nth-child(2n){background-color:#f6f8fa}td,th{border:1px solid #dfe2e5;padding:.6em 1em}.custom-layout{padding-top:3.6rem}.theme-container.sidebar-open .sidebar-mask{display:block}.theme-container.no-navbar .content:not(.custom)>h1,.theme-container.no-navbar h2,.theme-container.no-navbar h3,.theme-container.no-navbar h4,.theme-container.no-navbar h5,.theme-container.no-navbar h6{margin-top:1.5rem;padding-top:0}.theme-container.no-navbar .sidebar{top:0}.theme-container.no-navbar .custom-layout{padding-top:0}@media (min-width:720px){.theme-container.no-sidebar .sidebar{display:none}.theme-container.no-sidebar .page{padding-left:0}}@media (max-width:959px){.sidebar{font-size:15px;width:16.4rem}.page{padding-left:16.4rem}}@media (max-width:719px){.sidebar{top:0;padding-top:3.6rem;transform:translateX(-100%);transition:transform .2s ease}.page{padding-left:0}.theme-container.sidebar-open .sidebar{transform:translateX(0)}.theme-container.no-navbar .sidebar{padding-top:0}}@media (max-width:419px){h1{font-size:1.9rem}.content div[class*=language-]{margin:.85rem -1.5rem;border-radius:0}}.icon.outbound{color:#aaa;display:inline-block}.badge[data-v-f9f5240a]{display:inline-block;font-size:14px;height:18px;line-height:18px;border-radius:3px;padding:0 6px;color:#fff;margin-right:5px;background-color:#42b983}.badge.middle[data-v-f9f5240a]{vertical-align:middle}.badge.top[data-v-f9f5240a]{vertical-align:top}.badge.green[data-v-f9f5240a],.badge.tip[data-v-f9f5240a]{background-color:#42b983}.badge.error[data-v-f9f5240a]{background-color:#da5961}.badge.warn[data-v-f9f5240a],.badge.warning[data-v-f9f5240a],.badge.yellow[data-v-f9f5240a]{background-color:#e7c000}

================================================
FILE: .vuepress/dist/assets/js/10.9e736429.js
================================================
(window.webpackJsonp=window.webpackJsonp||[]).push([[10],{175:function(t,e,i){"use strict";i.r(e);var s=i(0),n=Object(s.a)({},function(){this.$createElement;this._self._c;return this._m(0)},[function(){var t=this.$createElement,e=this._self._c||t;return e("div",{staticClass:"content"},[e("h4",{attrs:{id:"android代码中实现wap方式联网-360"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#android代码中实现wap方式联网-360","aria-hidden":"true"}},[this._v("#")]),this._v(" Android代码中实现WAP方式联网-360")]),this._v(" "),e("p",[this._v("http://blog.csdn.net/asce1885/article/details/7844159")])])}],!1,null,null,null);n.options.__file="Android代码中实现WAP方式联网-360.md";e.default=n.exports}}]);

================================================
FILE: .vuepress/dist/assets/js/11.79dd85f0.js
================================================
(window.webpackJsonp=window.webpackJsonp||[]).push([[11],{176:function(t,i,n){"use strict";n.r(i);var a=n(0),e=Object(a.a)({},function(){this.$createElement;this._self._c;return this._m(0)},[function(){var t=this.$createElement,i=this._self._c||t;return i("div",{staticClass:"content"},[i("h4",{attrs:{id:"android动画框架实现原理"}},[i("a",{staticClass:"header-anchor",attrs:{href:"#android动画框架实现原理","aria-hidden":"true"}},[this._v("#")]),this._v(" Android动画框架实现原理")]),this._v(" "),i("p",[this._v("Animation框架定义了透明度,旋转,缩放和位移几种常见的动画,而且控制的是整个View,实现原理是每次绘制视图时View所在的ViewGroup中的drawChild函数获取该View的Animation的Transformation值,然后调用canvas.concat(transformToApply.getMatrix()),通过矩阵运算完成动画帧,如果动画没有完成,继续调用invalidate()函数,启动下次绘制来驱动动画,动画过程中的帧之间间隙时间是绘制函数所消耗的时间,可能会导致动画消耗比较多的CPU资源,最重要的是,动画改变的只是显示,并不能相应事件。")])])}],!1,null,null,null);e.options.__file="Android动画框架实现原理.md";i.default=e.exports}}]);

================================================
FILE: .vuepress/dist/assets/js/12.73c7bb22.js
================================================
(window.webpackJsonp=window.webpackJsonp||[]).push([[12],{177:function(t,i,n){"use strict";n.r(i);var e=n(0),s=Object(e.a)({},function(){this.$createElement;this._self._c;return this._m(0)},[function(){var t=this.$createElement,i=this._self._c||t;return i("div",{staticClass:"content"},[i("h4",{attrs:{id:"android各个版本api的区别"}},[i("a",{staticClass:"header-anchor",attrs:{href:"#android各个版本api的区别","aria-hidden":"true"}},[this._v("#")]),this._v(" Android各个版本API的区别")]),this._v(" "),i("p",[this._v("http://blog.csdn.net/lijun952048910/article/details/7980562")])])}],!1,null,null,null);s.options.__file="Android各个版本API的区别.md";i.default=s.exports}}]);

================================================
FILE: .vuepress/dist/assets/js/13.f677d7c4.js
================================================
(window.webpackJsonp=window.webpackJsonp||[]).push([[13],{178:function(e,i,t){"use strict";t.r(i);var n=t(0),a=Object(n.a)({},function(){this.$createElement;this._self._c;return this._m(0)},[function(){var e=this,i=e.$createElement,t=e._self._c||i;return t("div",{staticClass:"content"},[t("h4",{attrs:{id:"android属性动画特性-乐视-小米"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#android属性动画特性-乐视-小米","aria-hidden":"true"}},[e._v("#")]),e._v(" Android属性动画特性-乐视-小米")]),e._v(" "),t("p",[e._v("如果你的需求中只需要对View进行移动、缩放、旋转和淡入淡出操作,那么补间动画确实已经足够健全了。但是很显然,这些功能是不足以覆盖所有的场景的,一旦我们的需求超出了移动、缩放、旋转和淡入淡出这四种对View的操作,那么补间动画就不能再帮我们忙了,也就是说它在功能和可扩展方面都有相当大的局限性,那么下面我们就来看看补间动画所不能胜任的场景。")]),e._v(" "),t("p",[e._v("注意上面我在介绍补间动画的时候都有使用“对View进行操作”这样的描述,没错,补间动画是只能够作用在View上的。也就是说,我们可以对一个Button、TextView、甚至是LinearLayout、或者其它任何继承自View的组件进行动画操作,但是如果我们想要对一个非View的对象进行动画操作,抱歉,补间动画就帮不上忙了。可能有的朋友会感到不能理解,我怎么会需要对一个非View的对象进行动画操作呢?这里我举一个简单的例子,比如说我们有一个自定义的View,在这个View当中有一个Point对象用于管理坐标,然后在onDraw()方法当中就是根据这个Point对象的坐标值来进行绘制的。也就是说,如果我们可以对Point对象进行动画操作,那么整个自定义View的动画效果就有了。显然,补间动画是不具备这个功能的,这是它的第一个缺陷。")]),e._v(" "),t("p",[e._v("然后补间动画还有一个缺陷,就是它只能够实现移动、缩放、旋转和淡入淡出这四种动画操作,那如果我们希望可以对View的背景色进行动态地改变呢?很遗憾,我们只能靠自己去实现了。说白了,之前的补间动画机制就是使用硬编码的方式来完成的,功能限定死就是这些,基本上没有任何扩展性可言。")]),e._v(" "),t("p",[e._v("最后,补间动画还有一个致命的缺陷,就是它只是改变了View的显示效果而已,而不会真正去改变View的属性。什么意思呢?比如说,现在屏幕的左上角有一个按钮,然后我们通过补间动画将它移动到了屏幕的右下角,现在你可以去尝试点击一下这个按钮,点击事件是绝对不会触发的,因为实际上这个按钮还是停留在屏幕的左上角,只不过补间动画将这个按钮绘制到了屏幕的右下角而已。")])])}],!1,null,null,null);a.options.__file="Android属性动画特性-乐视-小米.md";i.default=a.exports}}]);

================================================
FILE: .vuepress/dist/assets/js/14.f2b11944.js
================================================
(window.webpackJsonp=window.webpackJsonp||[]).push([[14],{179:function(a,t,s){"use strict";s.r(t);var e=s(0),r=Object(e.a)({},function(){this.$createElement;this._self._c;return this._m(0)},[function(){var a=this.$createElement,t=this._self._c||a;return t("div",{staticClass:"content"},[t("h4",{attrs:{id:"arraymap对比hashmap"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#arraymap对比hashmap","aria-hidden":"true"}},[this._v("#")]),this._v(" ArrayMap对比HashMap")]),this._v(" "),t("p",[this._v("http://lvable.com/?p=217")])])}],!1,null,null,null);r.options.__file="ArrayMap对比HashMap.md";t.default=r.exports}}]);

================================================
FILE: .vuepress/dist/assets/js/15.38abfb77.js
================================================
(window.webpackJsonp=window.webpackJsonp||[]).push([[15],{180:function(t,e,n){"use strict";n.r(e);var i=n(0),r=Object(i.a)({},function(){this.$createElement;this._self._c;return this._m(0)},[function(){var t=this.$createElement,e=this._self._c||t;return e("div",{staticClass:"content"},[e("h4",{attrs:{id:"contentprovider-乐视"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#contentprovider-乐视","aria-hidden":"true"}},[this._v("#")]),this._v(" ContentProvider-乐视")]),this._v(" "),e("p",[this._v("http://blog.csdn.net/coder_pig/article/details/47858489")])])}],!1,null,null,null);r.options.__file="ContentProvider-乐视.md";e.default=r.exports}}]);

================================================
FILE: .vuepress/dist/assets/js/16.3397fcb5.js
================================================
(window.webpackJsonp=window.webpackJsonp||[]).push([[16],{181:function(t,e,r){"use strict";r.r(e);var i=r(0),n=Object(i.a)({},function(){var t=this.$createElement,e=this._self._c||t;return e("div",{staticClass:"content"},[this._m(0),this._v(" "),e("ul",[e("li",[e("a",{attrs:{href:"http://www.lightskystreet.com/2015/10/12/glide_source_analysis/",target:"_blank",rel:"noopener noreferrer"}},[this._v("Glide源码分析"),e("OutboundLink")],1)]),this._v(" "),e("li",[e("a",{attrs:{href:"http://frodoking.github.io/2015/10/10/android-glide/",target:"_blank",rel:"noopener noreferrer"}},[this._v("Android Glide源码解析"),e("OutboundLink")],1)]),this._v(" "),e("li",[e("a",{attrs:{href:"http://ethanhua.cn/archives/243",target:"_blank",rel:"noopener noreferrer"}},[this._v("Glide功能模块设计分析之强大的缓存模块"),e("OutboundLink")],1)])])])},[function(){var t=this.$createElement,e=this._self._c||t;return e("h4",{attrs:{id:"glide源码解析"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#glide源码解析","aria-hidden":"true"}},[this._v("#")]),this._v(" Glide源码解析")])}],!1,null,null,null);n.options.__file="Glide源码解析.md";e.default=n.exports}}]);

================================================
FILE: .vuepress/dist/assets/js/17.f8e05c59.js
================================================
(window.webpackJsonp=window.webpackJsonp||[]).push([[17],{182:function(e,r,n){"use strict";n.r(r);var t=n(0),a=Object(t.a)({},function(){var e=this,r=e.$createElement,n=e._self._c||r;return n("div",{staticClass:"content"},[e._m(0),e._v(" "),n("ul",[n("li",[n("a",{attrs:{href:"https://www.zhihu.com/question/34652589",target:"_blank",rel:"noopener noreferrer"}},[e._v("Android中为什么主线程不会因为Looper.loop()里的死循环卡死?"),n("OutboundLink")],1)]),e._v(" "),n("li",[n("a",{attrs:{href:"https://github.com/xitu/gold-miner/blob/master/TODO/android-handler-internals.md",target:"_blank",rel:"noopener noreferrer"}},[e._v("探索 Android 大杀器—— Handler"),n("OutboundLink")],1)]),e._v(" "),n("li",[n("a",{attrs:{href:"http://blog.csdn.net/guolin_blog/article/details/9991569",target:"_blank",rel:"noopener noreferrer"}},[e._v("Android异步消息处理机制完全解析,带你从源码的角度彻底理解"),n("OutboundLink")],1)]),e._v(" "),n("li",[n("a",{attrs:{href:"http://droidyue.com/blog/2015/11/08/make-use-of-handlerthread/",target:"_blank",rel:"noopener noreferrer"}},[e._v("详解 Android 中的 HandlerThread"),n("OutboundLink")],1)]),e._v(" "),n("li",[n("a",{attrs:{href:"http://blog.csdn.net/luoshengyang/article/details/6817933",target:"_blank",rel:"noopener noreferrer"}},[e._v("Android应用程序消息处理机制(Looper、Handler)分析"),n("OutboundLink")],1)])])])},[function(){var e=this.$createElement,r=this._self._c||e;return r("h4",{attrs:{id:"handler-消息处理"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#handler-消息处理","aria-hidden":"true"}},[this._v("#")]),this._v(" Handler 消息处理")])}],!1,null,null,null);a.options.__file="Handler消息处理.md";r.default=a.exports}}]);

================================================
FILE: .vuepress/dist/assets/js/18.98a9b878.js
================================================
(window.webpackJsonp=window.webpackJsonp||[]).push([[18],{162:function(a,t,e){a.exports=e.p+"assets/img/hashmap.15c50e9d.jpg"},183:function(a,t,e){"use strict";e.r(t);var s=[function(){var a=this.$createElement,t=this._self._c||a;return t("h4",{attrs:{id:"hashmap的实现原理-美团"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#hashmap的实现原理-美团","aria-hidden":"true"}},[this._v("#")]),this._v(" HashMap的实现原理-美团")])},function(){var a=this.$createElement,t=this._self._c||a;return t("ol",[t("li",[this._v("HashMap概述:\nHashMap是基于哈希表的Map接口的非同步实现。此实现提供所有可选的映射操作,并允许使用null值和null键。此类不保证映射的顺序,特别是它不保证该顺序恒久不变。")]),this._v(" "),t("li",[this._v("HashMap的数据结构:\n在java编程语言中,最基本的结构就是两种,一个是数组,另外一个是模拟指针(引用),所有的数据结构都可以用这两个基本结构来构造的,HashMap也不例外。HashMap实际上是一个“链表散列”的数据结构,即数组和链表的结合体。")])])},function(){var a=this.$createElement,t=this._self._c||a;return t("p",[t("img",{attrs:{src:e(162),alt:""}})])}],n=e(0),r=Object(n.a)({},function(){var a=this,t=a.$createElement,e=a._self._c||t;return e("div",{staticClass:"content"},[a._m(0),a._v(" "),e("p",[e("a",{attrs:{href:"https://yikun.github.io/2015/04/01/Java-HashMap%E5%B7%A5%E4%BD%9C%E5%8E%9F%E7%90%86%E5%8F%8A%E5%AE%9E%E7%8E%B0/",target:"_blank",rel:"noopener noreferrer"}},[a._v("Java HashMap工作原理及实现"),e("OutboundLink")],1)]),a._v(" "),e("p",[e("a",{attrs:{href:"https://blog.csdn.net/justloveyou_/article/details/62893086",target:"_blank",rel:"noopener noreferrer"}},[a._v("Map 综述(一):彻头彻尾理解 HashMap"),e("OutboundLink")],1)]),a._v(" "),a._m(1),a._v(" "),a._m(2),a._v(" "),e("p",[a._v("从上图中可以看出,HashMap底层就是一个数组结构,数组中的每一项又是一个链表。当新建一个HashMap的时候,就会初始化一个数组。")])])},s,!1,null,null,null);r.options.__file="HashMap的实现原理-美团.md";t.default=r.exports}}]);

================================================
FILE: .vuepress/dist/assets/js/19.5a8d7fbe.js
================================================
(window.webpackJsonp=window.webpackJsonp||[]).push([[19],{184:function(e,a,t){"use strict";t.r(a);var i=t(0),o=Object(i.a)({},function(){this.$createElement;this._self._c;return this._m(0)},[function(){var e=this,a=e.$createElement,t=e._self._c||a;return t("div",{staticClass:"content"},[t("h4",{attrs:{id:"linearlayout和relativelayout性能对比-百度"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#linearlayout和relativelayout性能对比-百度","aria-hidden":"true"}},[e._v("#")]),e._v(" LinearLayout和RelativeLayout性能对比-百度")]),e._v(" "),t("ol",[t("li",[e._v("RelativeLayout会让子View调用2次onMeasure,LinearLayout 在有weight时,也会调用子View2次onMeasure")]),e._v(" "),t("li",[e._v("RelativeLayout的子View如果高度和RelativeLayout不同,则会引发效率问题,当子View很复杂时,这个问题会更加严重。如果可以,尽量使用padding代替margin。")]),e._v(" "),t("li",[e._v("在不影响层级深度的情况下,使用LinearLayout和FrameLayout而不是RelativeLayout。")])]),e._v(" "),t("p",[e._v("最后再思考一下文章开头那个矛盾的问题,为什么Google给开发者默认新建了个RelativeLayout,而自己却在DecorView中用了个LinearLayout。因为DecorView的层级深度是已知而且固定的,上面一个标题栏,下面一个内容栏。采用RelativeLayout并不会降低层级深度,所以此时在根节点上用LinearLayout是效率最高的。而之所以给开发者默认新建了个RelativeLayout是希望开发者能采用尽量少的View层级来表达布局以实现性能最优,因为复杂的View嵌套对性能的影响会更大一些。")])])}],!1,null,null,null);o.options.__file="LinearLayout对比RelativeLayout-百度.md";a.default=o.exports}}]);

================================================
FILE: .vuepress/dist/assets/js/2.23124c79.js
================================================
(window.webpackJsonp=window.webpackJsonp||[]).push([[2],{167:function(n,w,o){}}]);

================================================
FILE: .vuepress/dist/assets/js/20.8d6b010a.js
================================================
(window.webpackJsonp=window.webpackJsonp||[]).push([[20],{185:function(t,e,n){"use strict";n.r(e);var s=n(0),a=Object(s.a)({},function(){this.$createElement;this._self._c;return this._m(0)},[function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("div",{staticClass:"content"},[n("h1",{attrs:{id:"国内一线互联网公司内部面试题库"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#国内一线互联网公司内部面试题库","aria-hidden":"true"}},[t._v("#")]),t._v(" 国内一线互联网公司内部面试题库")]),t._v(" "),n("p",[t._v("想当年我面试了很多家公司,发现一线公司各家面试题相似程度很高,然后我就白天面试完,晚上回来就靠回忆把各个问题整理出来,以备下一次能回答的更好。所有面试题都是我一点点人肉回来的,希望对大家有所帮助。")]),t._v(" "),n("p",[t._v("面试题来自于阿里、腾讯、百度、小米、滴滴、乐视、美团、58、猎豹、360、新浪、搜狐内部题库")]),t._v(" "),n("p",[t._v("熟悉本文中列出的知识点会大大增加通过前两轮技术面试的几率。")]),t._v(" "),n("p",[t._v("欢迎一线公司员工提交内部面试题库,欢迎star。")])])}],!1,null,null,null);a.options.__file="README.md";e.default=a.exports}}]);

================================================
FILE: .vuepress/dist/assets/js/21.6c600605.js
================================================
(window.webpackJsonp=window.webpackJsonp||[]).push([[21],{186:function(t,a,e){"use strict";e.r(a);var o=e(0),r=Object(o.a)({},function(){this.$createElement;this._self._c;return this._m(0)},[function(){var t=this,a=t.$createElement,e=t._self._c||a;return e("div",{staticClass:"content"},[e("h4",{attrs:{id:"requestlayout-onlayout-ondraw-drawchild区别与联系-猎豹"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#requestlayout-onlayout-ondraw-drawchild区别与联系-猎豹","aria-hidden":"true"}},[t._v("#")]),t._v(" Requestlayout,onlayout,onDraw,DrawChild区别与联系-猎豹")]),t._v(" "),e("p",[t._v("requestLayout()方法 :会导致调用measure()过程 和 layout()过程 。\n将会根据标志位判断是否需要ondraw")]),t._v(" "),e("p",[t._v("onLayout()方法(如果该View是ViewGroup对象,需要实现该方法,对每个子视图进行布局)")]),t._v(" "),e("p",[t._v("调用onDraw()方法绘制视图本身   (每个View都需要重载该方法,ViewGroup不需要实现该方法)")]),t._v(" "),e("p",[t._v("drawChild()去重新回调每个子视图的draw()方法")])])}],!1,null,null,null);r.options.__file="Requestlayout,onlayout,onDraw,DrawChild区别与联系-猎豹.md";a.default=r.exports}}]);

================================================
FILE: .vuepress/dist/assets/js/22.c7ebece6.js
================================================
(window.webpackJsonp=window.webpackJsonp||[]).push([[22],{187:function(t,r,e){"use strict";e.r(r);var n=e(0),i=Object(n.a)({},function(){var t=this.$createElement,r=this._self._c||t;return r("div",{staticClass:"content"},[this._m(0),this._v(" "),r("ul",[r("li",[r("a",{attrs:{href:"http://gityuan.com/2015/09/19/android-touch/",target:"_blank",rel:"noopener noreferrer"}},[this._v("Android事件分发机制"),r("OutboundLink")],1)]),this._v(" "),r("li",[r("a",{attrs:{href:"https://www.jianshu.com/p/84b2e0038080",target:"_blank",rel:"noopener noreferrer"}},[this._v("深入理解Android之Touch事件的分发"),r("OutboundLink")],1)]),this._v(" "),r("li",[r("a",{attrs:{href:"http://hanhailong.com/2015/09/24/Android-%E4%B8%89%E5%BC%A0%E5%9B%BE%E6%90%9E%E5%AE%9ATouch%E4%BA%8B%E4%BB%B6%E4%BC%A0%E9%80%92%E6%9C%BA%E5%88%B6/",target:"_blank",rel:"noopener noreferrer"}},[this._v("Android-三张图搞定Touch事件传递机制"),r("OutboundLink")],1)])])])},[function(){var t=this.$createElement,r=this._self._c||t;return r("h4",{attrs:{id:"touch事件传递流程-小米"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#touch事件传递流程-小米","aria-hidden":"true"}},[this._v("#")]),this._v(" Touch事件传递流程-小米")])}],!1,null,null,null);i.options.__file="Touch事件传递流程-小米.md";r.default=i.exports}}]);

================================================
FILE: .vuepress/dist/assets/js/23.9b1d1cfc.js
================================================
(window.webpackJsonp=window.webpackJsonp||[]).push([[23],{188:function(t,e,n){"use strict";n.r(e);var u=n(0),i=Object(u.a)({},function(){this.$createElement;this._self._c;return this._m(0)},[function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("div",{staticClass:"content"},[n("h4",{attrs:{id:"ubuntu编译安卓系统-百度"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#ubuntu编译安卓系统-百度","aria-hidden":"true"}},[t._v("#")]),t._v(" Ubuntu编译安卓系统-百度")]),t._v(" "),n("ol",[n("li",[t._v("进入源码根目录")]),t._v(" "),n("li",[t._v(". build/envsetup.sh")]),t._v(" "),n("li",[t._v("lunch")]),t._v(" "),n("li",[t._v("full(编译全部)")]),t._v(" "),n("li",[t._v("userdebug(选择编译版本)")]),t._v(" "),n("li",[t._v("make -j8(开启8个线程编译)")])])])}],!1,null,null,null);i.options.__file="Ubuntu编译安卓系统-百度.md";e.default=i.exports}}]);

================================================
FILE: .vuepress/dist/assets/js/24.489e8ac8.js
================================================
(window.webpackJsonp=window.webpackJsonp||[]).push([[24],{189:function(i,t,e){"use strict";e.r(t);var n=e(0),v=Object(n.a)({},function(){this.$createElement;this._self._c;return this._m(0)},[function(){var i=this,t=i.$createElement,e=i._self._c||t;return e("div",{staticClass:"content"},[e("h4",{attrs:{id:"activity-window-view三者的差别-fragment的特点-360"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#activity-window-view三者的差别-fragment的特点-360","aria-hidden":"true"}},[i._v("#")]),i._v(" Activity Window View三者的差别,fragment的特点-360")]),i._v(" "),e("p",[i._v("Activity像一个工匠(控制单元),Window像窗户(承载模型),View像窗花(显示视图)\nLayoutInflater像剪刀,Xml配置像窗花图纸。")]),i._v(" "),e("ol",[e("li",[i._v("在Activity中调用attach,创建了一个Window")]),i._v(" "),e("li",[i._v("创建的window是其子类PhoneWindow,在attach中创建PhoneWindow")]),i._v(" "),e("li",[i._v("在Activity中调用setContentView(R.layout.xxx)")]),i._v(" "),e("li",[i._v("其中实际上是调用的getWindow().setContentView()")]),i._v(" "),e("li",[i._v("调用PhoneWindow中的setContentView方法")]),i._v(" "),e("li",[i._v("创建ParentView:作为ViewGroup的子类,实际是创建的DecorView(作为FramLayout的子类)")]),i._v(" "),e("li",[i._v("将指定的R.layout.xxx进行填充,通过布局填充器进行填充【其中的parent指的就是DecorView】")]),i._v(" "),e("li",[i._v("调用到ViewGroup")]),i._v(" "),e("li",[i._v("调用ViewGroup的removeAllView(),先将所有的view移除掉")]),i._v(" "),e("li",[i._v("添加新的view:addView()")])]),i._v(" "),e("p",[i._v("Fragment 特点")]),i._v(" "),e("ul",[e("li",[i._v("Fragment可以作为Activity界面的一部分组成出现;")]),i._v(" "),e("li",[i._v("可以在一个Activity中同时出现多个Fragment,并且一个Fragment也可以在多个Activity中使用;")]),i._v(" "),e("li",[i._v("在Activity运行过程中,可以添加、移除或者替换Fragment;")]),i._v(" "),e("li",[i._v("Fragment可以响应自己的输入事件,并且有自己的生命周期,它们的生命周期会受宿主Activity的生命周期影响。")])])])}],!1,null,null,null);v.options.__file="activity-window-view三者的差别-fragment的特点-360.md";t.default=v.exports}}]);

================================================
FILE: .vuepress/dist/assets/js/25.1d798f32.js
================================================
(window.webpackJsonp=window.webpackJsonp||[]).push([[25],{163:function(t,e,s){t.exports=s.p+"assets/img/fragment-life.92a94009.png"},190:function(t,e,s){"use strict";s.r(e);var n=[function(){var t=this.$createElement,e=this._self._c||t;return e("div",{staticClass:"content"},[e("h4",{attrs:{id:"fragment生命周期"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#fragment生命周期","aria-hidden":"true"}},[this._v("#")]),this._v(" Fragment生命周期")]),this._v(" "),e("p",[e("img",{attrs:{src:s(163),alt:""}})])])}],a=s(0),i=Object(a.a)({},function(){this.$createElement;this._self._c;return this._m(0)},n,!1,null,null,null);i.options.__file="fragment生命周期.md";e.default=i.exports}}]);

================================================
FILE: .vuepress/dist/assets/js/26.e477ad95.js
================================================
(window.webpackJsonp=window.webpackJsonp||[]).push([[26],{191:function(t,a,e){"use strict";e.r(a);var h=e(0),s=Object(h.a)({},function(){var t=this.$createElement,a=this._self._c||t;return a("div",{staticClass:"content"},[this._m(0),this._v(" "),a("p",[a("a",{attrs:{href:"http://www.233.com/ncre2/JAVA/jichu/20100717/084230917.html",target:"_blank",rel:"noopener noreferrer"}},[this._v("Java中hashmap和hashtable的区别"),a("OutboundLink")],1)])])},[function(){var t=this.$createElement,a=this._self._c||t;return a("h4",{attrs:{id:"hashmap和hashtable的区别-乐视-小米"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#hashmap和hashtable的区别-乐视-小米","aria-hidden":"true"}},[this._v("#")]),this._v(" hashmap和hashtable的区别-乐视-小米")])}],!1,null,null,null);s.options.__file="hashmap和hashtable的区别-乐视-小米.md";a.default=s.exports}}]);

================================================
FILE: .vuepress/dist/assets/js/27.d297fac7.js
================================================
(window.webpackJsonp=window.webpackJsonp||[]).push([[27],{192:function(t,n,e){"use strict";e.r(n);var a=e(0),r=Object(a.a)({},function(){this.$createElement;this._self._c;return this._m(0)},[function(){var t=this,n=t.$createElement,e=t._self._c||n;return e("div",{staticClass:"content"},[e("h4",{attrs:{id:"int-char-long各占多少字节数"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#int-char-long各占多少字节数","aria-hidden":"true"}},[t._v("#")]),t._v(" int-char-long各占多少字节数")]),t._v(" "),e("p",[t._v("byte 位数 8 字节数 1")]),t._v(" "),e("p",[t._v("short 16 2")]),t._v(" "),e("p",[t._v("int 32 4")]),t._v(" "),e("p",[t._v("long 64 8")]),t._v(" "),e("p",[t._v("float 32 4")]),t._v(" "),e("p",[t._v("double 64 8")]),t._v(" "),e("p",[t._v("char 16 2")])])}],!1,null,null,null);r.options.__file="int-char-long各占多少字节数.md";n.default=r.exports}}]);

================================================
FILE: .vuepress/dist/assets/js/28.c36b0549.js
================================================
(window.webpackJsonp=window.webpackJsonp||[]).push([[28],{193:function(n,t,e){"use strict";e.r(t);var i=e(0),a=Object(i.a)({},function(){var n=this,t=n.$createElement,e=n._self._c||t;return e("div",{staticClass:"content"},[n._m(0),n._v(" "),e("p",[e("a",{attrs:{href:"http://blog.csdn.net/singwhatiwanna/article/details/17041691",target:"_blank",rel:"noopener noreferrer"}},[n._v("android跨进程通信(IPC):使用AIDL"),e("OutboundLink")],1)]),n._v(" "),e("p",[n._v("生成一个默认的且与主线程互相独立的工作者线程来执行所有传送至onStartCommand() 方法的Intetnt。")]),n._v(" "),e("p",[n._v("生成一个工作队列来传送Intent对象给你的onHandleIntent()方法,同一时刻只传送一个Intent对象,这样一来,你就不必担心多线程的问题。在所有的请求(Intent)都被执行完以后会自动停止服务,所以,你不需要自己去调用stopSelf()方法来停止。")]),n._v(" "),e("p",[n._v("该服务提供了一个onBind()方法的默认实现,它返回null")]),n._v(" "),e("p",[n._v("提供了一个onStartCommand()方法的默认实现,它将Intent先传送至工作队列,然后从工作队列中每次取出一个传送至onHandleIntent()方法,在该方法中对Intent对相应的处理。")]),n._v(" "),e("p",[n._v("AIDL (Android Interface Definition Language) 是一种IDL 语言,用于生成可以在Android设备上两个进程之间进行进程间通信(interprocess communication, IPC)的代码。如果在一个进程中(例如Activity)要调用另一个进程中(例如Service)对象的操作,就可以使用AIDL生成可序列化的参数。\nAIDL IPC机制是面向接口的,像COM或Corba一样,但是更加轻量级。它是使用代理类在客户端和实现端传递数据。")])])},[function(){var n=this.$createElement,t=this._self._c||n;return t("h4",{attrs:{id:"intentservice作用是什么-aidl解决了什么问题-小米"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#intentservice作用是什么-aidl解决了什么问题-小米","aria-hidden":"true"}},[this._v("#")]),this._v(" intentService作用是什么,AIDL解决了什么问题-小米")])}],!1,null,null,null);a.options.__file="intentService作用是什么,AIDL解决了什么问题?-小米.md";t.default=a.exports}}]);

================================================
FILE: .vuepress/dist/assets/js/29.2f26e65a.js
================================================
(window.webpackJsonp=window.webpackJsonp||[]).push([[29],{194:function(t,e,i){"use strict";i.r(e);var n=i(0),s=Object(n.a)({},function(){this.$createElement;this._self._c;return this._m(0)},[function(){var t=this.$createElement,e=this._self._c||t;return e("div",{staticClass:"content"},[e("h4",{attrs:{id:"int与integer的区别"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#int与integer的区别","aria-hidden":"true"}},[this._v("#")]),this._v(" int与integer的区别")]),this._v(" "),e("p",[this._v("http://www.cnblogs.com/shenliang123/archive/2011/10/27/2226903.html")])])}],!1,null,null,null);s.options.__file="int与integer的区别.md";e.default=s.exports}}]);

================================================
FILE: .vuepress/dist/assets/js/3.888b2472.js
================================================
(window.webpackJsonp=window.webpackJsonp||[]).push([[3],{160:function(t,e,n){},161:function(t,e,n){"use strict";var a=n(160);n.n(a).a},168:function(t,e,n){"use strict";n.r(e);var a={functional:!0,props:{type:{type:String,default:"tip"},text:String,vertical:{type:String,default:"top"}},render:function(t,e){var n=e.props,a=e.slots;return t("span",{class:["badge",n.type,n.vertical]},n.text||a().default)}},i=(n(161),n(0)),o=Object(i.a)(a,void 0,void 0,!1,null,"f9f5240a",null);o.options.__file="Badge.vue";e.default=o.exports}}]);

================================================
FILE: .vuepress/dist/assets/js/30.1c7e4986.js
================================================
(window.webpackJsonp=window.webpackJsonp||[]).push([[30],{195:function(t,a,e){"use strict";e.r(a);var n=e(0),i=Object(n.a)({},function(){var t=this.$createElement,a=this._self._c||t;return a("div",{staticClass:"content"},[this._m(0),this._v(" "),a("p",[a("a",{attrs:{href:"http://www.cnblogs.com/rayray/p/3437048.html",target:"_blank",rel:"noopener noreferrer"}},[this._v("Invalidate和postInvalidate的区别"),a("OutboundLink")],1)]),this._v(" "),a("p",[a("a",{attrs:{href:"http://blog.csdn.net/ziwang_/article/details/65690751",target:"_blank",rel:"noopener noreferrer"}},[this._v("postInvalidate() 和 invalidate() 的区别与联系"),a("OutboundLink")],1)])])},[function(){var t=this.$createElement,a=this._self._c||t;return a("h4",{attrs:{id:"从实例和源码角度理解-postinvalidate-和-invalidate-的区别与联系"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#从实例和源码角度理解-postinvalidate-和-invalidate-的区别与联系","aria-hidden":"true"}},[this._v("#")]),this._v(" 从实例和源码角度理解 postInvalidate() 和 invalidate() 的区别与联系")])}],!1,null,null,null);i.options.__file="invalidate和postInvalidate的区别及使用-百度.md";a.default=i.exports}}]);

================================================
FILE: .vuepress/dist/assets/js/31.32f7c857.js
================================================
(window.webpackJsonp=window.webpackJsonp||[]).push([[31],{196:function(t,a,e){"use strict";e.r(a);var s=e(0),n=Object(s.a)({},function(){this.$createElement;this._self._c;return this._m(0)},[function(){var t=this.$createElement,a=this._self._c||t;return a("div",{staticClass:"content"},[a("h1",{attrs:{id:"java-部分"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#java-部分","aria-hidden":"true"}},[this._v("#")]),this._v(" Java 部分")])])}],!1,null,null,null);n.options.__file="java.md";a.default=n.exports}}]);

================================================
FILE: .vuepress/dist/assets/js/32.a13ca202.js
================================================
(window.webpackJsonp=window.webpackJsonp||[]).push([[32],{197:function(v,t,_){"use strict";_.r(t);var a=_(0),i=Object(a.a)({},function(){this.$createElement;this._self._c;return this._m(0)},[function(){var v=this,t=v.$createElement,_=v._self._c||t;return _("div",{staticClass:"content"},[_("h4",{attrs:{id:"java多态-乐视"}},[_("a",{staticClass:"header-anchor",attrs:{href:"#java多态-乐视","aria-hidden":"true"}},[v._v("#")]),v._v(" java多态-乐视")]),v._v(" "),_("p",[v._v("Java多态性理解")]),v._v(" "),_("p",[v._v("Java中多态性的实现")]),v._v(" "),_("p",[v._v("什么是多态")]),v._v(" "),_("p",[v._v("面向对象的三大特性:封装、继承、多态。从一定角度来看,封装和继承几乎都是为多态而准备的。这是我们最后一个概念,也是最重要的知识点。")]),v._v(" "),_("p",[v._v("多态的定义:指允许不同类的对象对同一消息做出响应。即同一消息可以根据发送对象的不同而采用多种不同的行为方式。(发送消息就是函数调用)")]),v._v(" "),_("p",[v._v("实现多态的技术称为:动态绑定(dynamic binding),是指在执行期间判断所引用对象的实\n际类型,根据其实际的类型调用其相应的方法。")]),v._v(" "),_("p",[v._v("多态的作用:消除类型之间的耦合关系。")]),v._v(" "),_("p",[v._v("现实中,关于多态的例子不胜枚举。比方说按下 F1 键这个动作,如果当前在 Flash 界面下弹出的就是 AS 3 的帮助文档;如果当前在 Word 下弹出的就是 Word 帮助;在 Windows 下弹出的就是 Windows 帮助和支持。同一个事件发生在不同的对象上会产生不同的结果。\n下面是多态存在的三个必要条件,要求大家做梦时都能背出来!")]),v._v(" "),_("p",[v._v("多态存在的三个必要条件\n一、要有继承;\n二、要有重写;\n三、父类引用指向子类对象。")]),v._v(" "),_("p",[v._v("多态的好处:")]),v._v(" "),_("p",[v._v("1.可替换性(substitutability)。多态对已存在代码具有可替换性。例如,多态对圆Circle类工作,对其他任何圆形几何体,如圆环,也同样工作。")]),v._v(" "),_("p",[v._v("2.可扩充性(extensibility)。多态对代码具有可扩充性。增加新的子类不影响已存在类的多态性、继承性,以及其他特性的运行和操作。实际上新加子类更容易获得多态功能。例如,在实现了圆锥、半圆锥以及半球体的多态基础上,很容易增添球体类的多态性。")]),v._v(" "),_("p",[v._v("3.接口性(interface-ability)。多态是超类通过方法签名,向子类提供了一个共同接口,由子类来完善或者覆盖它而实现的。如图8.3 所示。图中超类Shape规定了两个实现多态的接口方法,computeArea()以及computeVolume()。子类,如Circle和Sphere为了实现多态,完善或者覆盖这两个接口方法。")]),v._v(" "),_("p",[v._v("4.灵活性(flexibility)。它在应用中体现了灵活多样的操作,提高了使用效率。")]),v._v(" "),_("p",[v._v("5.简化性(simplicity)。多态简化对应用软件的代码编写和修改过程,尤其在处理大量对象的运算和操作时,这个特点尤为突出和重要。")]),v._v(" "),_("p",[v._v("Java中多态的实现方式:接口实现,继承父类进行方法重写,同一个类中进行方法重载。")])])}],!1,null,null,null);i.options.__file="java多态-乐视.md";t.default=i.exports}}]);

================================================
FILE: .vuepress/dist/assets/js/33.90bf4621.js
================================================
(window.webpackJsonp=window.webpackJsonp||[]).push([[33],{198:function(t,e,a){"use strict";a.r(e);var r=a(0),n=Object(r.a)({},function(){var t=this.$createElement,e=this._self._c||t;return e("div",{staticClass:"content"},[this._m(0),this._v(" "),e("p",[e("a",{attrs:{href:"http://www.jianshu.com/p/8c915179fd02",target:"_blank",rel:"noopener noreferrer"}},[this._v("必须知道的八大种排序算法"),e("OutboundLink")],1)]),this._v(" "),e("p",[e("a",{attrs:{href:"http://xiaojun-it.iteye.com/blog/2291852",target:"_blank",rel:"noopener noreferrer"}},[this._v("常用查找算法"),e("OutboundLink")],1)])])},[function(){var t=this.$createElement,e=this._self._c||t;return e("h4",{attrs:{id:"java排序算法-美团"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#java排序算法-美团","aria-hidden":"true"}},[this._v("#")]),this._v(" java排序算法-美团")])}],!1,null,null,null);n.options.__file="java排序查找算法-美团.md";e.default=n.exports}}]);

================================================
FILE: .vuepress/dist/assets/js/34.bb5f949f.js
================================================
(window.webpackJsonp=window.webpackJsonp||[]).push([[34],{199:function(t,e,s){"use strict";s.r(e);var n=s(0),i=Object(n.a)({},function(){this.$createElement;this._self._c;return this._m(0)},[function(){var t=this.$createElement,e=this._self._c||t;return e("div",{staticClass:"content"},[e("h4",{attrs:{id:"状态机"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#状态机","aria-hidden":"true"}},[this._v("#")]),this._v(" 状态机")]),this._v(" "),e("p",[this._v("http://www.jdon.com/designpatterns/designpattern_State.htm")])])}],!1,null,null,null);i.options.__file="java状态机.md";e.default=i.exports}}]);

================================================
FILE: .vuepress/dist/assets/js/35.b283dac3.js
================================================
(window.webpackJsonp=window.webpackJsonp||[]).push([[35],{200:function(t,i,n){"use strict";n.r(i);var e=n(0),v=Object(e.a)({},function(){this.$createElement;this._self._c;return this._m(0)},[function(){var t=this,i=t.$createElement,n=t._self._c||i;return n("div",{staticClass:"content"},[n("h4",{attrs:{id:"launchmode应用场景-百度-小米-乐视"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#launchmode应用场景-百度-小米-乐视","aria-hidden":"true"}},[t._v("#")]),t._v(" LaunchMode应用场景-百度-小米-乐视")]),t._v(" "),n("p",[t._v("standard,创建一个新的Activity。")]),t._v(" "),n("p",[t._v("singleTop,栈顶不是该类型的Activity,创建一个新的Activity。否则,onNewIntent。")]),t._v(" "),n("p",[t._v("singleTask,回退栈中没有该类型的Activity,创建Activity,否则,onNewIntent+ClearTop。")]),t._v(" "),n("p",[t._v("注意:")]),t._v(" "),n("ol",[n("li",[t._v('设置了"singleTask"启动模式的Activity,它在启动的时候,会先在系统中查找属性值affinity等于它的属性值taskAffinity的Task存在; 如果存在这样的Task,它就会在这个Task中启动,否则就会在新的任务栈中启动。因此, 如果我们想要设置了"singleTask"启动模式的Activity在新的任务中启动,就要为它设置一个独立的taskAffinity属性值。')]),t._v(" "),n("li",[t._v('如果设置了"singleTask"启动模式的Activity不是在新的任务中启动时,它会在已有的任务中查看是否已经存在相应的Activity实例, 如果存在,就会把位于这个Activity实例上面的Activity全部结束掉,即最终这个Activity 实例会位于任务的Stack顶端中。')]),t._v(" "),n("li",[t._v("在一个任务栈中只有一个”singleTask”启动模式的Activity存在。他的上面可以有其他的Activity。这点与singleInstance是有区别的。")])]),t._v(" "),n("p",[t._v("singleInstance,回退栈中,只有这一个Activity,没有其他Activity。")]),t._v(" "),n("p",[t._v("singleTop适合接收通知启动的内容显示页面。")]),t._v(" "),n("p",[t._v("例如,某个新闻客户端的新闻内容页面,如果收到10个新闻推送,每次都打开一个新闻内容页面是很烦人的。")]),t._v(" "),n("p",[t._v("singleTask适合作为程序入口点。")]),t._v(" "),n("p",[t._v("例如浏览器的主界面。不管从多少个应用启动浏览器,只会启动主界面一次,其余情况都会走onNewIntent,并且会清空主界面上面的其他页面。")]),t._v(" "),n("p",[t._v("singleInstance应用场景:")]),t._v(" "),n("p",[t._v("闹铃的响铃界面。 你以前设置了一个闹铃:上午6点。在上午5点58分,你启动了闹铃设置界面,并按 Home 键回桌面;在上午5点59分时,你在微信和朋友聊天;在6点时,闹铃响了,并且弹出了一个对话框形式的 Activity(名为 AlarmAlertActivity) 提示你到6点了(这个 Activity 就是以 SingleInstance 加载模式打开的),你按返回键,回到的是微信的聊天界面,这是因为 AlarmAlertActivity 所在的 Task 的栈只有他一个元素, 因此退出之后这个 Task 的栈空了。如果是以 SingleTask 打开 AlarmAlertActivity,那么当闹铃响了的时候,按返回键应该进入闹铃设置界面。")])])}],!1,null,null,null);v.options.__file="launchmode应用场景-百度-小米-乐视.md";i.default=v.exports}}]);

================================================
FILE: .vuepress/dist/assets/js/36.3032c4bb.js
================================================
(window.webpackJsonp=window.webpackJsonp||[]).push([[36],{201:function(t,n,s){"use strict";s.r(n);var r=s(0),a=Object(r.a)({},function(){this.$createElement;this._self._c;return this._m(0)},[function(){var t=this,n=t.$createElement,s=t._self._c||n;return s("div",{staticClass:"content"},[s("h4",{attrs:{id:"string-stringbuffer-stringbuilder区别-小米-乐视-百度"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#string-stringbuffer-stringbuilder区别-小米-乐视-百度","aria-hidden":"true"}},[t._v("#")]),t._v(" string-stringbuffer-stringbuilder区别-小米-乐视-百度")]),t._v(" "),s("p",[t._v("String 字符串常量")]),t._v(" "),s("p",[t._v("StringBuffer 字符串变量(线程安全)")]),t._v(" "),s("p",[t._v("StringBuilder 字符串变量(非线程安全)")]),t._v(" "),s("p",[t._v("简要的说, String 类型和 StringBuffer 类型的主要性能区别其实在于 String 是不可变的对象, 因此在每次对 String 类型进行改变的时候其实都等同于生成了一个新的 String 对象,然后将指针指向新的 String 对象,所以经常改变内容的字符串最好不要用String ,因为每次生成对象都会对系统性能产生影响,特别当内存中无引用对象多了以后,JVM 的 GC 就会开始工作,那速度是一定会相当慢的。")]),t._v(" "),s("p",[t._v("而如果是使用 StringBuffer 类则结果就不一样了,每次结果都会对 StringBuffer 对象本身进行操作,而不是生成新的对象,再改变对象引用。所以在一般情况下我们推荐使用 StringBuffer ,特别是字符串对象经常改变的情况下。而在某些特别情况下, String 对象的字符串拼接其实是被 JVM 解释成了 StringBuffer 对象的拼接,所以这些时候 String 对象的速度并不会比 StringBuffer 对象慢,而特别是以下的字符串对象生成中, String 效率是远要比 StringBuffer 快的:")]),t._v(" "),s("div",{staticClass:"language-java extra-class"},[s("pre",{pre:!0,attrs:{class:"language-java"}},[s("code",[t._v("String S1 "),s("span",{attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{attrs:{class:"token string"}},[t._v('"This is only a"')]),t._v(" "),s("span",{attrs:{class:"token operator"}},[t._v("+")]),t._v(" "),s("span",{attrs:{class:"token string"}},[t._v('"simple"')]),t._v(" "),s("span",{attrs:{class:"token operator"}},[t._v("+")]),t._v(" "),s("span",{attrs:{class:"token string"}},[t._v('" test"')]),s("span",{attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\nStringBuffer Sb "),s("span",{attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{attrs:{class:"token keyword"}},[t._v("new")]),t._v(" "),s("span",{attrs:{class:"token class-name"}},[t._v("StringBuffer")]),s("span",{attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{attrs:{class:"token string"}},[t._v('"This is only a"')]),s("span",{attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{attrs:{class:"token function"}},[t._v("append")]),s("span",{attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{attrs:{class:"token string"}},[t._v('"simple"')]),s("span",{attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{attrs:{class:"token function"}},[t._v("append")]),s("span",{attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{attrs:{class:"token string"}},[t._v('"test"')]),s("span",{attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("p",[t._v("你会很惊讶的发现,生成 String S1 对象的速度简直太快了,而这个时候 StringBuffer 居然速度上根本一点都不占优势。其实这是 JVM 的一个把戏,在 JVM 眼里,这个\nString S1 = “This is only a” + “ simple” + “test”; 其实就是:\nString S1 = “This is only a simple test”; 所以当然不需要太多的时间了。但大家这里要注意的是,如果你的字符串是来自另外的 String 对象的话,速度就没那么快了,譬如:\nString S2 = “This is only a”;\nString S3 = “ simple”;\nString S4 = “ test”;\nString S1 = S2 +S3 + S4;\n这时候 JVM 会规规矩矩的按照原来的方式去做")]),t._v(" "),s("p",[t._v("在大部分情况下 StringBuffer > String")]),t._v(" "),s("p",[t._v("StringBuffer")]),t._v(" "),s("p",[t._v("Java.lang.StringBuffer线程安全的可变字符序列。一个类似于 String 的字符串缓冲区,但不能修改。虽然在任意时间点上它都包含某种特定的字符序列,但通过某些方法调用可以改变该序列的长度和内容。")]),t._v(" "),s("p",[t._v("可将字符串缓冲区安全地用于多个线程。可以在必要时对这些方法进行同步,因此任意特定实例上的所有操作就好像是以串行顺序发生的,该顺序与所涉及的每个线程进行的方法调用顺序一致。")]),t._v(" "),s("p",[t._v("StringBuffer 上的主要操作是 append 和 insert 方法,可重载这些方法,以接受任意类型的数据。每个方法都能有效地将给定的数据转换成字符串,然后将该字符串的字符追加或插入到字符串缓冲区中。append 方法始终将这些字符添加到缓冲区的末端;而 insert 方法则在指定的点添加字符。")]),t._v(" "),s("p",[t._v('例如,如果 z 引用一个当前内容是“start”的字符串缓冲区对象,则此方法调用 z.append("le") 会使字符串缓冲区包含“startle”,而 z.insert(4, "le") 将更改字符串缓冲区,使之包含“starlet”。')]),t._v(" "),s("p",[t._v("在大部分情况下 StringBuilder > StringBuffer")]),t._v(" "),s("p",[t._v("java.lang.StringBuilder")]),t._v(" "),s("p",[t._v("java.lang.StringBuilder一个可变的字符序列是5.0新增的。此类提供一个与 StringBuffer 兼容的 API,但不保证同步。该类被设计用作 StringBuffer 的一个简易替换,用在字符串缓冲区被单个线程使用的时候(这种情况很普遍)。如果可能,建议优先采用该类,因为在大多数实现中,它比 StringBuffer 要快。两者的方法基本相同")])])}],!1,null,null,null);a.options.__file="string-stringbuffer-stringbuilder区别-小米-乐视-百度.md";n.default=a.exports}}]);

================================================
FILE: .vuepress/dist/assets/js/37.6ff405bc.js
================================================
(window.webpackJsonp=window.webpackJsonp||[]).push([[37],{202:function(t,e,i){"use strict";i.r(e);var r=i(0),n=Object(r.a)({},function(){var t=this.$createElement,e=this._self._c||t;return e("div",{staticClass:"content"},[this._m(0),this._v(" "),e("ul",[e("li",[e("a",{attrs:{href:"http://www.codekk.com/blogs/detail/54cfab086c4761e5001b253f",target:"_blank",rel:"noopener noreferrer"}},[this._v("公共技术点之 View 绘制流程"),e("OutboundLink")],1)]),this._v(" "),e("li",[e("a",{attrs:{href:"https://www.jianshu.com/p/5a71014e7b1b",target:"_blank",rel:"noopener noreferrer"}},[this._v("Android View的绘制流程"),e("OutboundLink")],1)])])])},[function(){var t=this.$createElement,e=this._self._c||t;return e("h4",{attrs:{id:"view绘制流程-百度"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#view绘制流程-百度","aria-hidden":"true"}},[this._v("#")]),this._v(" View绘制流程-百度")])}],!1,null,null,null);n.options.__file="view绘制流程-百度.md";e.default=n.exports}}]);

================================================
FILE: .vuepress/dist/assets/js/38.f6a52e06.js
================================================
(window.webpackJsonp=window.webpackJsonp||[]).push([[38],{203:function(t,e,n){"use strict";n.r(e);var r=n(0),l=Object(r.a)({},function(){var t=this.$createElement,e=this._self._c||t;return e("div",{staticClass:"content"},[this._m(0),this._v(" "),e("p",[e("a",{attrs:{href:"http://a.codekk.com/detail/Android/grumoon/Volley%20%E6%BA%90%E7%A0%81%E8%A7%A3%E6%9E%90",target:"_blank",rel:"noopener noreferrer"}},[this._v("Volley 源码解析"),e("OutboundLink")],1)])])},[function(){var t=this.$createElement,e=this._self._c||t;return e("h4",{attrs:{id:"volley解析-美团-乐视"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#volley解析-美团-乐视","aria-hidden":"true"}},[this._v("#")]),this._v(" volley解析-美团-乐视")])}],!1,null,null,null);l.options.__file="volley解析-美团-乐视.md";e.default=l.exports}}]);

================================================
FILE: .vuepress/dist/assets/js/39.7ce0a0f5.js
================================================
(window.webpackJsonp=window.webpackJsonp||[]).push([[39],{204:function(e,t,i){"use strict";i.r(t);var n=i(0),s=Object(n.a)({},function(){this.$createElement;this._self._c;return this._m(0)},[function(){var e=this,t=e.$createElement,i=e._self._c||t;return i("div",{staticClass:"content"},[i("h4",{attrs:{id:"什么导致线程阻塞-58-美团"}},[i("a",{staticClass:"header-anchor",attrs:{href:"#什么导致线程阻塞-58-美团","aria-hidden":"true"}},[e._v("#")]),e._v(" 什么导致线程阻塞-58-美团")]),e._v(" "),i("p",[e._v("线程的阻塞")]),e._v(" "),i("p",[e._v("为了解决对共享存储区的访问冲突,Java 引入了同步机制,现在让我们来考察多个线程对共享资源的访问,显然同步机制已经不够了,因为在任意时刻所要求的资源不一定已经准备好了被访问,反过来,同一时刻准备好了的资源也可能不止一个。为了解决这种情况下的访问控制问题,Java 引入了对阻塞机制的支持.")]),e._v(" "),i("p",[e._v("阻塞指的是暂停一个线程的执行以等待某个条件发生(如某资源就绪),学过操作系统的同学对它一定已经很熟悉了。Java 提供了大量方法来支持阻塞,下面让我们逐一分析。")]),e._v(" "),i("ol",[i("li",[e._v("sleep() 方法:sleep() 允许 指定以毫秒为单位的一段时间作为参数,它使得线程在指定的时间内进入阻塞状态,不能得到CPU 时间,指定的时间一过,线程重新进入可执行状态。\n典型地,sleep() 被用在等待某个资源就绪的情形:测试发现条件不满足后,让线程阻塞一段时间后重新测试,直到条件满足为止。")]),e._v(" "),i("li",[e._v("suspend() 和 resume() 方法:两个方法配套使用,suspend()使得线程进入阻塞状态,并且不会自动恢复,必须其对应的resume() 被调用,才能使得线程重新进入可执行状态。典型地,suspend() 和 resume() 被用在等待另一个线程产生的结果的情形:测试发现结果还没有产生后,让线程阻塞,另一个线程产生了结果后,调用 resume() 使其恢复。")]),e._v(" "),i("li",[e._v("yield() 方法:yield() 使得线程放弃当前分得的 CPU 时间,但是不使线程阻塞,即线程仍处于可执行状态,随时可能再次分得 CPU 时间。调用 yield() 的效果等价于调度程序认为该线程已执行了足够的时间从而转到另一个线程.")]),e._v(" "),i("li",[e._v("wait() 和 notify() 方法:两个方法配套使用,wait() 使得线程进入阻塞状态,它有两种形式,一种允许 指定以毫秒为单位的一段时间作为参数,另一种没有参数,前者当对应的 notify() 被调用或者超出指定时间时线程重新进入可执行状态,后者则必须对应的 notify() 被调用.")])]),e._v(" "),i("p",[e._v("初看起来它们与 suspend() 和 resume() 方法对没有什么分别,但是事实上它们是截然不同的。区别的核心在于,前面叙述的所有方法,阻塞时都不会释放占用的锁(如果占用了的话),而这一对方法则相反。")]),e._v(" "),i("p",[e._v("上述的核心区别导致了一系列的细节上的区别。")]),e._v(" "),i("p",[e._v("首先,前面叙述的所有方法都隶属于 Thread 类,但是这一对却直接隶属于 Object 类,也就是说,所有对象都拥有这一对方法。初看起来这十分不可思议,但是实际上却是很自然的,因为这一对方法阻塞时要释放占用的锁,而锁是任何对象都具有的,调用任意对象的 wait() 方法导致线程阻塞,并且该对象上的锁被释放。而调用 任意对象的notify()方法则导致因调用该对象的 wait() 方法而阻塞的线程中随机选择的一个解除阻塞(但要等到获得锁后才真正可执行)。")]),e._v(" "),i("p",[e._v("其次,前面叙述的所有方法都可在任何位置调用,但是这一对方法却必须在 synchronized 方法或块中调用,理由也很简单,只有在synchronized 方法或块中当前线程才占有锁,才有锁可以释放。同样的道理,调用这一对方法的对象上的锁必须为当前线程所拥有,这样才有锁可以释放。因此,这一对方法调用必须放置在这样的 synchronized 方法或块中,该方法或块的上锁对象就是调用这一对方法的对象。若不满足这一条件,则程序虽然仍能编译,但在运行时会出现IllegalMonitorStateException 异常。")]),e._v(" "),i("p",[e._v("wait() 和 notify() 方法的上述特性决定了它们经常和synchronized 方法或块一起使用,将它们和操作系统的进程间通信机制作一个比较就会发现它们的相似性:synchronized方法或块提供了类似于操作系统原语的功能,它们的执行不会受到多线程机制的干扰,而这一对方法则相当于 block 和wakeup 原语(这一对方法均声明为 synchronized)。它们的结合使得我们可以实现操作系统上一系列精妙的进程间通信的算法(如信号量算法),并用于解决各种复杂的线程间通信问题。")]),e._v(" "),i("p",[e._v("关于 wait() 和 notify() 方法最后再说明两点:")]),e._v(" "),i("p",[e._v("第一:调用 notify() 方法导致解除阻塞的线程是从因调用该对象的 wait() 方法而阻塞的线程中随机选取的,我们无法预料哪一个线程将会被选择,所以编程时要特别小心,避免因这种不确定性而产生问题。")]),e._v(" "),i("p",[e._v("第二:除了 notify(),还有一个方法 notifyAll() 也可起到类似作用,唯一的区别在于,调用 notifyAll() 方法将把因调用该对象的 wait() 方法而阻塞的所有线程一次性全部解除阻塞。当然,只有获得锁的那一个线程才能进入可执行状态。")]),e._v(" "),i("p",[e._v("谈到阻塞,就不能不谈一谈死锁,略一分析就能发现,suspend() 方法和不指定超时期限的 wait() 方法的调用都可能产生死锁。遗憾的是,Java 并不在语言级别上支持死锁的避免,我们在编程中必须小心地避免死锁。")]),e._v(" "),i("p",[e._v("以上我们对 Java 中实现线程阻塞的各种方法作了一番分析,我们重点分析了 wait() 和 notify() 方法,因为它们的功能最强大,使用也最灵活,但是这也导致了它们的效率较低,较容易出错。实际使用中我们应该灵活使用各种方法,以便更好地达到我们的目的。")])])}],!1,null,null,null);s.options.__file="什么导致线程阻塞-58-美团.md";t.default=s.exports}}]);

================================================
FILE: .vuepress/dist/assets/js/4.fe41294f.js
================================================
(window.webpackJsonp=window.webpackJsonp||[]).push([[4],{169:function(e,t,n){"use strict";n.r(t);var r=n(0),i=Object(r.a)({},function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",{staticClass:"content"},[e._m(0),e._v(" "),n("p",[n("a",{attrs:{href:"https://juejin.im/entry/578d938079bc44005ff26aec/detail",target:"_blank",rel:"noopener noreferrer"}},[n("img",{attrs:{src:"https://badge.juejin.im/entry/578d938079bc44005ff26aec/likes.svg?style=flat",alt:""}}),n("OutboundLink")],1)]),e._v(" "),n("p",[n("a",{attrs:{href:"https://github.com/JackyAndroid/AndroidInterview-Q-A",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github Repo"),n("OutboundLink")],1),e._v(" welcome star | Github 仓库 欢迎star")]),e._v(" "),n("p",[n("a",{attrs:{href:"https://jackyandroid.github.io/AndroidInterview-Q-A/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Online Doc | 在线文档"),n("OutboundLink")],1)]),e._v(" "),n("p",[e._v("English doc is coming soon..")]),e._v(" "),e._m(1)])},[function(){var e=this.$createElement,t=this._self._c||e;return t("h3",{attrs:{id:"the-top-internet-companies-android-interview-questions-and-answers"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#the-top-internet-companies-android-interview-questions-and-answers","aria-hidden":"true"}},[this._v("#")]),this._v(" The top Internet companies android interview questions and answers")])},function(){var e=this.$createElement,t=this._self._c||e;return t("p",[t("img",{attrs:{src:"http://www.jackywang.tech/images/gongzh.png",alt:""}})])}],!1,null,null,null);i.options.__file="README.md";t.default=i.exports}}]);

================================================
FILE: .vuepress/dist/assets/js/40.1662d618.js
================================================
(window.webpackJsonp=window.webpackJsonp||[]).push([[40],{205:function(t,e,i){"use strict";i.r(e);var r=i(0),n=Object(r.a)({},function(){var t=this.$createElement,e=this._self._c||t;return e("div",{staticClass:"content"},[this._m(0),this._v(" "),e("p",[e("a",{attrs:{href:"http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2015/0920/3478.html",target:"_blank",rel:"noopener noreferrer"}},[this._v("Android内存优化之OOM"),e("OutboundLink")],1)]),this._v(" "),this._m(1)])},[function(){var t=this.$createElement,e=this._self._c||t;return e("h4",{attrs:{id:"什么情况导致oom-乐视-美团"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#什么情况导致oom-乐视-美团","aria-hidden":"true"}},[this._v("#")]),this._v(" 什么情况导致oom-乐视-美团")])},function(){var t=this,e=t.$createElement,i=t._self._c||e;return i("ol",[i("li",[t._v("使用更加轻量的数据结构")]),t._v(" "),i("li",[t._v("Android里面使用Enum")]),t._v(" "),i("li",[t._v("Bitmap对象的内存占用")]),t._v(" "),i("li",[t._v("更大的图片")]),t._v(" "),i("li",[t._v("onDraw方法里面执行对象的创建")]),t._v(" "),i("li",[t._v("StringBuilder")])])}],!1,null,null,null);n.options.__file="什么情况导致oom-乐视-美团.md";e.default=n.exports}}]);

================================================
FILE: .vuepress/dist/assets/js/41.2a812c43.js
================================================
(window.webpackJsonp=window.webpackJsonp||[]).push([[41],{206:function(t,n,a){"use strict";a.r(n);var s=a(0),e=Object(s.a)({},function(){this.$createElement;this._self._c;return this._m(0)},[function(){var t=this,n=t.$createElement,a=t._self._c||n;return a("div",{staticClass:"content"},[a("h4",{attrs:{id:"什么情况导致内存泄漏-美团"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#什么情况导致内存泄漏-美团","aria-hidden":"true"}},[t._v("#")]),t._v(" 什么情况导致内存泄漏-美团")]),t._v(" "),a("p",[t._v("1.资源对象没关闭造成的内存泄漏")]),t._v(" "),a("p",[t._v("描述:\n资源性对象比如(Cursor,File文件等)往往都用了一些缓冲,我们在不使用的时候,应该及时关闭它们,以便它们的缓冲及时回收内存。它们的缓冲不仅存在于 java虚拟机内,还存在于java虚拟机外。如果我们仅仅是把它的引用设置为null,而不关闭它们,往往会造成内存泄漏。因为有些资源性对象,比如 SQLiteCursor(在析构函数finalize(),如果我们没有关闭它,它自己会调close()关闭),如果我们没有关闭它,系统在回收它时也会关闭它,但是这样的效率太低了。因此对于资源性对象在不使用的时候,应该调用它的close()函数,将其关闭掉,然后才置为null.在我们的程序退出时一定要确保我们的资源性对象已经关闭。\n程序中经常会进行查询数据库的操作,但是经常会有使用完毕Cursor后没有关闭的情况。如果我们的查询结果集比较小,对内存的消耗不容易被发现,只有在常时间大量操作的情况下才会复现内存问题,这样就会给以后的测试和问题排查带来困难和风险。")]),t._v(" "),a("p",[t._v("2.构造Adapter时,没有使用缓存的convertView")]),t._v(" "),a("p",[t._v("描述:\n以构造ListView的BaseAdapter为例,在BaseAdapter中提供了方法:\npublic View getView(int position, ViewconvertView, ViewGroup parent)\n来向ListView提供每一个item所需要的view对象。初始时ListView会从BaseAdapter中根据当前的屏幕布局实例化一定数量的 view对象,同时ListView会将这些view对象缓存起来。当向上滚动ListView时,原先位于最上面的list item的view对象会被回收,然后被用来构造新出现的最下面的list item。这个构造过程就是由getView()方法完成的,getView()的第二个形参View convertView就是被缓存起来的list item的view对象(初始化时缓存中没有view对象则convertView是null)。由此可以看出,如果我们不去使用 convertView,而是每次都在getView()中重新实例化一个View对象的话,即浪费资源也浪费时间,也会使得内存占用越来越大。 ListView回收list item的view对象的过程可以查看:\nandroid.widget.AbsListView.java --\x3e voidaddScrapView(View scrap) 方法。\n示例代码:")]),t._v(" "),a("div",{staticClass:"language-java extra-class"},[a("pre",{pre:!0,attrs:{class:"language-java"}},[a("code",[a("span",{attrs:{class:"token keyword"}},[t._v("public")]),t._v(" View "),a("span",{attrs:{class:"token function"}},[t._v("getView")]),a("span",{attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{attrs:{class:"token keyword"}},[t._v("int")]),t._v(" position"),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" ViewconvertView"),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" ViewGroup parent"),a("span",{attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\nView view "),a("span",{attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{attrs:{class:"token keyword"}},[t._v("new")]),t._v(" "),a("span",{attrs:{class:"token class-name"}},[t._v("Xxx")]),a("span",{attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" \n"),a("span",{attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{attrs:{class:"token punctuation"}},[t._v(".")]),t._v(" "),a("span",{attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{attrs:{class:"token punctuation"}},[t._v(".")]),t._v(" \n"),a("span",{attrs:{class:"token keyword"}},[t._v("return")]),t._v(" view"),a("span",{attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" \n"),a("span",{attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" \n")])])]),a("p",[t._v("修正示例代码:")]),t._v(" "),a("div",{staticClass:"language-java extra-class"},[a("pre",{pre:!0,attrs:{class:"language-java"}},[a("code",[a("span",{attrs:{class:"token keyword"}},[t._v("public")]),t._v(" View "),a("span",{attrs:{class:"token function"}},[t._v("getView")]),a("span",{attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{attrs:{class:"token keyword"}},[t._v("int")]),t._v(" position"),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" ViewconvertView"),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" ViewGroup parent"),a("span",{attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\nView view "),a("span",{attrs:{class:"token operator"}},[t._v("=")]),t._v(" null"),a("span",{attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" \n"),a("span",{attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),a("span",{attrs:{class:"token punctuation"}},[t._v("(")]),t._v("convertView "),a("span",{attrs:{class:"token operator"}},[t._v("!=")]),t._v(" null"),a("span",{attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" \nview "),a("span",{attrs:{class:"token operator"}},[t._v("=")]),t._v(" convertView"),a("span",{attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" \n"),a("span",{attrs:{class:"token function"}},[t._v("populate")]),a("span",{attrs:{class:"token punctuation"}},[t._v("(")]),t._v("view"),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{attrs:{class:"token function"}},[t._v("getItem")]),a("span",{attrs:{class:"token punctuation"}},[t._v("(")]),t._v("position"),a("span",{attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" \n"),a("span",{attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{attrs:{class:"token punctuation"}},[t._v(".")]),t._v(" \n"),a("span",{attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" "),a("span",{attrs:{class:"token keyword"}},[t._v("else")]),t._v(" "),a("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" \nview "),a("span",{attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{attrs:{class:"token keyword"}},[t._v("new")]),t._v(" "),a("span",{attrs:{class:"token class-name"}},[t._v("Xxx")]),a("span",{attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" \n"),a("span",{attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{attrs:{class:"token punctuation"}},[t._v(".")]),t._v(" \n"),a("span",{attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" \n"),a("span",{attrs:{class:"token keyword"}},[t._v("return")]),t._v(" view"),a("span",{attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" \n"),a("span",{attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" \n")])])]),a("p",[t._v("3.Bitmap对象不在使用时调用recycle()释放内存")]),t._v(" "),a("p",[t._v("描述:\n有时我们会手工的操作Bitmap对象,如果一个Bitmap对象比较占内存,当它不在被使用的时候,可以调用Bitmap.recycle()方法回收此对象的像素所占用的内存,但这不是必须的,视情况而定。可以看一下代码中的注释:")]),t._v(" "),a("p",[t._v('/** \n•Free up the memory associated with thisbitmap\'s pixels, and mark the \n•bitmap as "dead", meaning itwill throw an exception if getPixels() or \n•setPixels() is called, and will drawnothing. This operation cannot be \n•reversed, so it should only be called ifyou are sure there are no \n•further uses for the bitmap. This is anadvanced call, and normally need \n•not be called, since the normal GCprocess will free up this memory when \n•there are no more references to thisbitmap. \n*/')]),t._v(" "),a("p",[t._v("4.试着使用关于application的context来替代和activity相关的context")]),t._v(" "),a("p",[t._v("这是一个很隐晦的内存泄漏的情况。有一种简单的方法来避免context相关的内存泄漏。最显著地一个是避免context逃出他自己的范围之外。使用Application context。这个context的生存周期和你的应用的生存周期一样长,而不是取决于activity的生存周期。如果你想保持一个长期生存的对象,并且这个对象需要一个context,记得使用application对象。你可以通过调用 Context.getApplicationContext() or Activity.getApplication()来获得。更多的请看这篇文章如何避免\nAndroid内存泄漏。")]),t._v(" "),a("p",[t._v("5.注册没取消造成的内存泄漏")]),t._v(" "),a("p",[t._v("一些Android程序可能引用我们的Anroid程序的对象(比如注册机制)。即使我们的Android程序已经结束了,但是别的引用程序仍然还有对我们的Android程序的某个对象的引用,泄漏的内存依然不能被垃圾回收。调用registerReceiver后未调用unregisterReceiver。\n比如:假设我们希望在锁屏界面(LockScreen)中,监听系统中的电话服务以获取一些信息(如信号强度等),则可以在LockScreen中定义一个 PhoneStateListener的对象,同时将它注册到TelephonyManager服务中。对于LockScreen对象,当需要显示锁屏界面的时候就会创建一个LockScreen对象,而当锁屏界面消失的时候LockScreen对象就会被释放掉。\n但是如果在释放 LockScreen对象的时候忘记取消我们之前注册的PhoneStateListener对象,则会导致LockScreen无法被垃圾回收。如果不断的使锁屏界面显示和消失,则最终会由于大量的LockScreen对象没有办法被回收而引起OutOfMemory,使得system_process 进程挂掉。\n虽然有些系统程序,它本身好像是可以自动取消注册的(当然不及时),但是我们还是应该在我们的程序中明确的取消注册,程序结束时应该把所有的注册都取消掉。")]),t._v(" "),a("p",[t._v("6.集合中对象没清理造成的内存泄漏")]),t._v(" "),a("p",[t._v("我们通常把一些对象的引用加入到了集合中,当我们不需要该对象时,并没有把它的引用从集合中清理掉,这样这个集合就会越来越大。如果这个集合是static的话,那情况就更严重了。")])])}],!1,null,null,null);e.options.__file="什么情况导致内存泄漏-美团.md";n.default=e.exports}}]);

================================================
FILE: .vuepress/dist/assets/js/42.5e53f08f.js
================================================
(window.webpackJsonp=window.webpackJsonp||[]).push([[42],{207:function(e,i,t){"use strict";t.r(i);var a=t(0),n=Object(a.a)({},function(){this.$createElement;this._self._c;return this._m(0)},[function(){var e=this,i=e.$createElement,t=e._self._c||i;return t("div",{staticClass:"content"},[t("h4",{attrs:{id:"优化自定义view百度-乐视-小米"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#优化自定义view百度-乐视-小米","aria-hidden":"true"}},[e._v("#")]),e._v(" 优化自定义view百度-乐视-小米")]),e._v(" "),t("p",[e._v("为了加速你的view,对于频繁调用的方法,需要尽量减少不必要的代码。先从onDraw开始,需要特别注意不应该在这里做内存分配的事情,因为它会导致GC,从而导致卡顿。在初始化或者动画间隙期间做分配内存的动作。不要在动画正在执行的时候做内存分配的事情。")]),e._v(" "),t("p",[e._v("你还需要尽可能的减少onDraw被调用的次数,大多数时候导致onDraw都是因为调用了invalidate().因此请尽量减少调用invaildate()的次数。如果可能的话,尽量调用含有4个参数的invalidate()方法而不是没有参数的invalidate()。没有参数的invalidate会强制重绘整个view。")]),e._v(" "),t("p",[e._v("另外一个非常耗时的操作是请求layout。任何时候执行requestLayout(),会使得Android UI系统去遍历整个View的层级来计算出每一个view的大小。如果找到有冲突的值,它会需要重新计算好几次。另外需要尽量保持View的层级是扁平化的,这样对提高效率很有帮助。")]),e._v(" "),t("p",[e._v("如果你有一个复杂的UI,你应该考虑写一个自定义的ViewGroup来执行他的layout操作。与内置的view不同,自定义的view可以使得程序仅仅测量这一部分,这避免了遍历整个view的层级结构来计算大小。这个PieChart 例子展示了如何继承ViewGroup作为自定义view的一部分。PieChart 有子views,但是它从来不测量它们。而是根据他自身的layout法则,直接设置它们的大小。")])])}],!1,null,null,null);n.options.__file="优化自定义view百度-乐视-小米.md";i.default=n.exports}}]);

================================================
FILE: .vuepress/dist/assets/js/43.c4fa5c7d.js
================================================
(window.webpackJsonp=window.webpackJsonp||[]).push([[43],{208:function(t,i,s){"use strict";s.r(i);var a=s(0),e=Object(a.a)({},function(){this.$createElement;this._self._c;return this._m(0)},[function(){var t=this.$createElement,i=this._self._c||t;return i("div",{staticClass:"content"},[i("h4",{attrs:{id:"低版本sdk实现高版本api-小米"}},[i("a",{staticClass:"header-anchor",attrs:{href:"#低版本sdk实现高版本api-小米","aria-hidden":"true"}},[this._v("#")]),this._v(" 低版本SDK实现高版本api-小米")]),this._v(" "),i("p",[this._v("自己实现或@TargetApi annotation")])])}],!1,null,null,null);e.options.__file="低版本SDK实现高版本api-小米.md";i.default=e.exports}}]);

================================================
FILE: .vuepress/dist/assets/js/44.ae8007c2.js
================================================
(window.webpackJsonp=window.webpackJsonp||[]).push([[44],{209:function(t,e,r){"use strict";r.r(e);var a=r(0),n=Object(a.a)({},function(){var t=this.$createElement,e=this._self._c||t;return e("div",{staticClass:"content"},[this._m(0),this._v(" "),e("ul",[e("li",[e("a",{attrs:{href:"http://www.iteye.com/topic/806990",target:"_blank",rel:"noopener noreferrer"}},[this._v("java线程安全总结"),e("OutboundLink")],1)]),this._v(" "),e("li",[e("a",{attrs:{href:"http://ifeve.com/java-memory-model-0/",target:"_blank",rel:"noopener noreferrer"}},[this._v("深入理解java内存模型系列文章"),e("OutboundLink")],1)])])])},[function(){var t=this.$createElement,e=this._self._c||t;return e("h4",{attrs:{id:"内存模型"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#内存模型","aria-hidden":"true"}},[this._v("#")]),this._v(" 内存模型")])}],!1,null,null,null);n.options.__file="内存模型.md";e.default=n.exports}}]);

================================================
FILE: .vuepress/dist/assets/js/45.9cbb4e19.js
================================================
(window.webpackJsonp=window.webpackJsonp||[]).push([[45],{210:function(t,s,e){"use strict";e.r(s);var n=e(0),i=Object(n.a)({},function(){this.$createElement;this._self._c;return this._m(0)},[function(){var t=this.$createElement,s=this._self._c||t;return s("div",{staticClass:"content"},[s("h4",{attrs:{id:"内部类"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#内部类","aria-hidden":"true"}},[this._v("#")]),this._v(" 内部类")]),this._v(" "),s("p",[this._v("http://www.cnblogs.com/chenssy/p/3388487.html")])])}],!1,null,null,null);i.options.__file="内部类.md";s.default=i.exports}}]);

================================================
FILE: .vuepress/dist/assets/js/46.2249db82.js
================================================
(window.webpackJsonp=window.webpackJsonp||[]).push([[46],{211:function(t,e,i){"use strict";i.r(e);var n=i(0),s=Object(n.a)({},function(){this.$createElement;this._self._c;return this._m(0)},[function(){var t=this,e=t.$createElement,i=t._self._c||e;return i("div",{staticClass:"content"},[i("h4",{attrs:{id:"内部类的作用-乐视"}},[i("a",{staticClass:"header-anchor",attrs:{href:"#内部类的作用-乐视","aria-hidden":"true"}},[t._v("#")]),t._v(" 内部类的作用-乐视")]),t._v(" "),i("ol",[i("li",[t._v("内部类可以用多个实例,每个实例都有自己的状态信息,并且与其他外围对象的信息相互独立。")]),t._v(" "),i("li",[t._v("在单个外围类中,可以让多个内部类以不同的方式实现同一个接口,或者继承同一个类。")]),t._v(" "),i("li",[t._v("创建内部类对象的时刻并不依赖于外围类对象的创建。")]),t._v(" "),i("li",[t._v("内部类并没有令人迷惑的“is-a”关系,他就是一个独立的实体。")]),t._v(" "),i("li",[t._v("内部类提供了更好的封装,除了该外围类,其他类都不能访问")])])])}],!1,null,null,null);s.options.__file="内部类的作用-乐视.md";e.default=s.exports}}]);

================================================
FILE: .vuepress/dist/assets/js/47.1b41f358.js
================================================
(window.webpackJsonp=window.webpackJsonp||[]).push([[47],{164:function(t,a,s){t.exports=s.p+"assets/img/collection.392abd9e.png"},212:function(t,a,s){"use strict";s.r(a);var e=[function(){var t=this.$createElement,a=this._self._c||t;return a("div",{staticClass:"content"},[a("h4",{attrs:{id:"列举java的集合和继承关系-百度-美团"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#列举java的集合和继承关系-百度-美团","aria-hidden":"true"}},[this._v("#")]),this._v(" 列举java的集合和继承关系-百度-美团")]),this._v(" "),a("p",[a("img",{attrs:{src:s(164),alt:""}})])])}],i=s(0),n=Object(i.a)({},function(){this.$createElement;this._self._c;return this._m(0)},e,!1,null,null,null);n.options.__file="列举java的集合和继承关系-百度-美团.md";a.default=n.exports}}]);

================================================
FILE: .vuepress/dist/assets/js/48.387309f2.js
================================================
(window.webpackJsonp=window.webpackJsonp||[]).push([[48],{213:function(t,s,e){"use strict";e.r(s);var i=e(0),n=Object(i.a)({},function(){this.$createElement;this._self._c;return this._m(0)},[function(){var t=this.$createElement,s=this._self._c||t;return s("div",{staticClass:"content"},[s("h4",{attrs:{id:"哪些情况下的对象会被垃圾回收机制处理掉-美团-小米"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#哪些情况下的对象会被垃圾回收机制处理掉-美团-小米","aria-hidden":"true"}},[this._v("#")]),this._v(" 哪些情况下的对象会被垃圾回收机制处理掉-美团-小米")]),this._v(" "),s("p",[this._v("Java 垃圾回收机制最基本的做法是分代回收。内存中的区域被划分成不同的世代,对象根据其存活的时间被保存在对应世代的区域中。一般的实现是划分成3个世代:年轻、年老和永久。内存的分配是发生在年轻世代中的。当一个对象存活时间足够长的时候,它就会被复制到年老世代中。对于不同的世代可以使用不同的垃圾回收算法。进行世代划分的出发点是对应用中对象存活时间进行研究之后得出的统计规律。一般来说,一个应用中的大部分对象的存活时间都很短。比如局部变量的存活时间就只在方法的执行过程中。基于这一点,对于年轻世代的垃圾回收算法就可以很有针对性。")])])}],!1,null,null,null);n.options.__file="哪些情况下的对象会被垃圾回收机制处理掉-美团-小米.md";s.default=n.exports}}]);

================================================
FILE: .vuepress/dist/assets/js/49.2316ffc9.js
================================================
(window.webpackJsonp=window.webpackJsonp||[]).push([[49],{214:function(e,r,t){"use strict";t.r(r);var n=t(0),s=Object(n.a)({},function(){var e=this,r=e.$createElement,t=e._self._c||r;return t("div",{staticClass:"content"},[e._m(0),e._v(" "),e._m(1),e._v(" "),t("ul",[t("li",[t("a",{attrs:{href:"http://stackoverflow.com/questions/29363321/picasso-v-s-imageloader-v-s-fresco-vs-glide",target:"_blank",rel:"noopener noreferrer"}},[e._v("picasso vs imageloader vs fresco vs glide"),t("OutboundLink")],1)]),e._v(" "),t("li",[t("a",{attrs:{href:"http://www.trinea.cn/android/android-image-cache-compare/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Android 三大图片缓存原理、特性对比"),t("OutboundLink")],1)])]),e._v(" "),e._m(2),e._v(" "),t("ul",[t("li",[t("a",{attrs:{href:"https://juejin.im/entry/586766331b69e60063d889ea",target:"_blank",rel:"noopener noreferrer"}},[e._v("Glide"),t("OutboundLink")],1)]),e._v(" "),t("li",[t("a",{attrs:{href:"http://skykai521.github.io/2016/02/25/Picasso%E6%BA%90%E4%BB%A3%E7%A0%81%E5%88%86%E6%9E%90/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Picasso"),t("OutboundLink")],1)]),e._v(" "),t("li",[t("a",{attrs:{href:"https://github.com/desmond1121/Fresco-Source-Analysis",target:"_blank",rel:"noopener noreferrer"}},[e._v("Fresco"),t("OutboundLink")],1)])])])},[function(){var e=this.$createElement,r=this._self._c||e;return r("h4",{attrs:{id:"图片"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#图片","aria-hidden":"true"}},[this._v("#")]),this._v(" 图片")])},function(){var e=this.$createElement,r=this._self._c||e;return r("p",[r("strong",[this._v("图片库对比")])])},function(){var e=this.$createElement,r=this._self._c||e;return r("p",[r("strong",[this._v("源码解析")])])}],!1,null,null,null);s.options.__file="图片.md";r.default=s.exports}}]);

================================================
FILE: .vuepress/dist/assets/js/5.b8a0041f.js
================================================
(window.webpackJsonp=window.webpackJsonp||[]).push([[5],{170:function(t,n,e){"use strict";e.r(n);var s=e(0),i=Object(s.a)({},function(){var t=this.$createElement;return(this._self._c||t)("div",{staticClass:"content"})},[],!1,null,null,null);i.options.__file="README.md";n.default=i.exports}}]);

================================================
FILE: .vuepress/dist/assets/js/50.16f26c0e.js
================================================
(window.webpackJsonp=window.webpackJsonp||[]).push([[50],{215:function(e,t,r){"use strict";r.r(t);var n=r(0),i=Object(n.a)({},function(){var e=this.$createElement,t=this._self._c||e;return t("div",{staticClass:"content"},[this._m(0),this._v(" "),t("ul",[t("li",[t("a",{attrs:{href:"https://github.com/kesenhoo/android-training-course-in-chinese/blob/master/performance/memory.md",target:"_blank",rel:"noopener noreferrer"}},[this._v("管理应用的内存"),t("OutboundLink")],1)]),this._v(" "),t("li",[t("a",{attrs:{href:"https://www.ibm.com/developerworks/cn/opensource/os-cn-android-mmry-rcycl/index.html",target:"_blank",rel:"noopener noreferrer"}},[this._v("Android 操作系统的内存回收机制"),t("OutboundLink")],1)]),this._v(" "),t("li",[t("a",{attrs:{href:"https://mp.weixin.qq.com/s/CUU3Ml394H_fkabhNNX32Q",target:"_blank",rel:"noopener noreferrer"}},[this._v("Android GC 原理探究"),t("OutboundLink")],1)])])])},[function(){var e=this.$createElement,t=this._self._c||e;return t("h4",{attrs:{id:"垃圾回收"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#垃圾回收","aria-hidden":"true"}},[this._v("#")]),this._v(" 垃圾回收")])}],!1,null,null,null);i.options.__file="垃圾回收.md";t.default=i.exports}}]);

================================================
FILE: .vuepress/dist/assets/js/51.ad1837d2.js
================================================
(window.webpackJsonp=window.webpackJsonp||[]).push([[51],{216:function(t,e,n){"use strict";n.r(e);var i=n(0),a=Object(i.a)({},function(){this.$createElement;this._self._c;return this._m(0)},[function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("div",{staticClass:"content"},[n("h4",{attrs:{id:"多线程-360"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#多线程-360","aria-hidden":"true"}},[t._v("#")]),t._v(" 多线程-360")]),t._v(" "),n("ul",[n("li",[t._v("Activity.runOnUiThread(Runnable)")]),t._v(" "),n("li",[t._v("View.post(Runnable),View.postDelay(Runnable,long)")]),t._v(" "),n("li",[t._v("Handler")]),t._v(" "),n("li",[t._v("AsyncTask")])])])}],!1,null,null,null);a.options.__file="多线程-360.md";e.default=a.exports}}]);

================================================
FILE: .vuepress/dist/assets/js/52.53997134.js
================================================
(window.webpackJsonp=window.webpackJsonp||[]).push([[52],{217:function(e,i,t){"use strict";t.r(i);var n=t(0),v=Object(n.a)({},function(){this.$createElement;this._self._c;return this._m(0)},[function(){var e=this,i=e.$createElement,t=e._self._c||i;return t("div",{staticClass:"content"},[t("h4",{attrs:{id:"如何保证service在后台不被kill"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#如何保证service在后台不被kill","aria-hidden":"true"}},[e._v("#")]),e._v(" 如何保证service在后台不被Kill")]),e._v(" "),t("p",[e._v("一、onStartCommand方法,返回START_STICKY")]),e._v(" "),t("ol",[t("li",[t("p",[e._v("START_STICKY\n在运行onStartCommand后service进程被kill后,那将保留在开始状态,但是不保留那些传入的intent。不久后service就会再次尝试重新创建,因为保留在开始状态,在创建     service后将保证调用onstartCommand。如果没有传递任何开始命令给service,那将获取到null的intent。")])]),e._v(" "),t("li",[t("p",[e._v("START_NOT_STICKY\n在运行onStartCommand后service进程被kill后,并且没有新的intent传递给它。Service将移出开始状态,并且直到新的明显的方法(startService)调用才重新创建。因为如果没有传递任何未决定的intent那么service是不会启动,也就是期间onstartCommand不会接收到任何null的intent。")])]),e._v(" "),t("li",[t("p",[e._v("START_REDELIVER_INTENT\n在运行onStartCommand后service进程被kill后,系统将会再次启动service,并传入最后一个intent给onstartCommand。直到调用stopSelf(int)才停止传递intent。如果在被kill后还有未处理好的intent,那被kill后服务还是会自动启动。因此onstartCommand不会接收到任何null的intent。")])])]),e._v(" "),t("p",[e._v("二、提升service进程优先级")]),e._v(" "),t("p",[e._v("Android中的进程是托管的,当系统进程空间紧张的时候,会依照优先级自动进行进程的回收。Android将进程分为6个等级,它们按优先级顺序由高到低依次是:")]),e._v(" "),t("ol",[t("li",[e._v("前台进程( FOREGROUND_APP)")]),e._v(" "),t("li",[e._v("可视进程(VISIBLE_APP )")]),e._v(" "),t("li",[e._v("次要服务进程(SECONDARY_SERVER )")]),e._v(" "),t("li",[e._v("后台进程 (HIDDEN_APP)")]),e._v(" "),t("li",[e._v("内容供应节点(CONTENT_PROVIDER)")]),e._v(" "),t("li",[e._v("空进程(EMPTY_APP)")])]),e._v(" "),t("p",[e._v("当service运行在低内存的环境时,将会kill掉一些存在的进程。因此进程的优先级将会很重要,可以使用startForeground 将service放到前台状态。这样在低内存时被kill的几率会低一些。")]),e._v(" "),t("p",[e._v("三、onDestroy方法里重启service")]),e._v(" "),t("p",[e._v("service +broadcast  方式,就是当service走ondestory的时候,发送一个自定义的广播,当收到广播的时候,重新启动service;")]),e._v(" "),t("p",[e._v("四、Application加上Persistent属性")]),e._v(" "),t("p",[e._v("五、监听系统广播判断Service状态")]),e._v(" "),t("p",[e._v("通过系统的一些广播,比如:手机重启、界面唤醒、应用状态改变等等监听并捕获到,然后判断我们的Service是否还存活,别忘记加权限啊。")])])}],!1,null,null,null);v.options.__file="如何保证service在后台不被kill.md";i.default=v.exports}}]);

================================================
FILE: .vuepress/dist/assets/js/53.efacfabf.js
================================================
(window.webpackJsonp=window.webpackJsonp||[]).push([[53],{218:function(t,e,a){"use strict";a.r(e);var n=a(0),r=Object(n.a)({},function(){this.$createElement;this._self._c;return this._m(0)},[function(){var t=this,e=t.$createElement,a=t._self._c||e;return a("div",{staticClass:"content"},[a("h4",{attrs:{id:"如何导入外部数据库"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#如何导入外部数据库","aria-hidden":"true"}},[t._v("#")]),t._v(" 如何导入外部数据库")]),t._v(" "),a("p",[t._v("把原数据库包括在项目源码的 res/raw")]),t._v(" "),a("p",[t._v("android系统下数据库应该存放在 /data/data/com."),a("em",[t._v(".")]),t._v("(package name)/ 目录下,所以我们需要做的是把已有的数据库传入那个目录下.操作方法是用FileInputStream读取原数据库,再用FileOutputStream把读取到的东西写入到那个目录.")])])}],!1,null,null,null);r.options.__file="如何导入外部数据库-小米.md";e.default=r.exports}}]);

================================================
FILE: .vuepress/dist/assets/js/54.ec024a7e.js
================================================
(window.webpackJsonp=window.webpackJsonp||[]).push([[54],{219:function(t,e,r){"use strict";r.r(e);var n=r(0),a=Object(n.a)({},function(){var t=this.$createElement,e=this._self._c||t;return e("div",{staticClass:"content"},[this._m(0),this._v(" "),e("ul",[e("li",[e("a",{attrs:{href:"http://alexyyek.github.io/2015/04/06/Collection/",target:"_blank",rel:"noopener noreferrer"}},[this._v("Java容器类"),e("OutboundLink")],1)]),this._v(" "),e("li",[e("a",{attrs:{href:"http://www.cnblogs.com/CarpenterLee/p/5545987.html",target:"_blank",rel:"noopener noreferrer"}},[this._v("《深入理解Java集合框架》系列文章"),e("OutboundLink")],1)])])])},[function(){var t=this.$createElement,e=this._self._c||t;return e("h4",{attrs:{id:"容器类之间的区别-乐视-美团"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#容器类之间的区别-乐视-美团","aria-hidden":"true"}},[this._v("#")]),this._v(" 容器类之间的区别-乐视-美团")])}],!1,null,null,null);a.options.__file="容器类之间的区别-乐视-美团.md";e.default=a.exports}}]);

================================================
FILE: .vuepress/dist/assets/js/55.90a5cae5.js
================================================
(window.webpackJsonp=window.webpackJsonp||[]).push([[55],{220:function(e,t,r){"use strict";r.r(t);var n=r(0),a=Object(n.a)({},function(){var e=this,t=e.$createElement,r=e._self._c||t;return r("div",{staticClass:"content"},[e._m(0),e._v(" "),r("p",[e._v("看Framework相关的东西,推荐一本书"),r("a",{attrs:{href:"https://e.jd.com/30149955.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("《Android内核剖析》"),r("OutboundLink")],1),e._v(",柯元旦老师写的,通俗易懂。")]),e._v(" "),r("ul",[r("li",[r("a",{attrs:{href:"https://blog.csdn.net/luoshengyang/article/details/6703247",target:"_blank",rel:"noopener noreferrer"}},[e._v("Android应用程序内部启动Activity过程(startActivity)的源代码分析"),r("OutboundLink")],1)]),e._v(" "),r("li",[r("a",{attrs:{href:"http://gityuan.com/2016/05/01/bind-service/",target:"_blank",rel:"noopener noreferrer"}},[e._v("bindService启动过程分析"),r("OutboundLink")],1)])])])},[function(){var e=this.$createElement,t=this._self._c||e;return t("h4",{attrs:{id:"常用framework模块原理"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#常用framework模块原理","aria-hidden":"true"}},[this._v("#")]),this._v(" 常用Framework模块原理")])}],!1,null,null,null);a.options.__file="常用Framework模块原理.md";t.default=a.exports}}]);

================================================
FILE: .vuepress/dist/assets/js/56.c99b5c22.js
================================================
(window.webpackJsonp=window.webpackJsonp||[]).push([[56],{221:function(e,r,t){"use strict";t.r(r);var n=t(0),a=Object(n.a)({},function(){var e=this,r=e.$createElement,t=e._self._c||r;return t("div",{staticClass:"content"},[e._m(0),e._v(" "),e._m(1),e._v(" "),t("ul",[t("li",[t("a",{attrs:{href:"http://www.blogjava.net/xylz/archive/2010/07/08/325587.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("《深入浅出 Java Concurrency》目录"),t("OutboundLink")],1)])]),e._v(" "),e._m(2),e._v(" "),t("ul",[t("li",[t("a",{attrs:{href:"http://blog.csdn.net/vking_wang/article/details/9952063",target:"_blank",rel:"noopener noreferrer"}},[e._v("锁机制:synchronized、Lock、Condition"),t("OutboundLink")],1)]),e._v(" "),t("li",[t("a",{attrs:{href:"http://wiki.jikexueyuan.com/project/java-concurrent/locks-in-java.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("Java 中的锁"),t("OutboundLink")],1)]),e._v(" "),t("li",[t("a",{attrs:{href:"https://blog.csdn.net/javazejian/article/details/72828483",target:"_blank",rel:"noopener noreferrer"}},[e._v("深入理解Java并发之synchronized实现原理"),t("OutboundLink")],1)]),e._v(" "),t("li",[t("a",{attrs:{href:"https://www.jianshu.com/p/12192b13990f",target:"_blank",rel:"noopener noreferrer"}},[e._v("CAS 和 AQS 原理"),t("OutboundLink")],1)])]),e._v(" "),e._m(3),e._v(" "),t("ul",[t("li",[t("a",{attrs:{href:"http://www.cnblogs.com/dolphin0520/p/3920357.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("Java并发编程:Thread类的使用"),t("OutboundLink")],1)]),e._v(" "),t("li",[t("a",{attrs:{href:"http://lavasoft.blog.51cto.com/62575/27069",target:"_blank",rel:"noopener noreferrer"}},[e._v("Java多线程编程总结"),t("OutboundLink")],1)]),e._v(" "),t("li",[t("a",{attrs:{href:"http://www.jianshu.com/p/053943a425c3#",target:"_blank",rel:"noopener noreferrer"}},[e._v("Java并发编程的总结与思考"),t("OutboundLink")],1)]),e._v(" "),t("li",[t("a",{attrs:{href:"http://www.infoq.com/cn/articles/ConcurrentHashMap",target:"_blank",rel:"noopener noreferrer"}},[e._v("深入分析ConcurrentHashMap"),t("OutboundLink")],1)]),e._v(" "),t("li",[t("a",{attrs:{href:"https://www.ibm.com/developerworks/cn/java/java-lo-concurrenthashmap/index.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("探索 ConcurrentHashMap 高并发性的实现机制"),t("OutboundLink")],1)])])])},[function(){var e=this.$createElement,r=this._self._c||e;return r("h4",{attrs:{id:"并发编程-猎豹"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#并发编程-猎豹","aria-hidden":"true"}},[this._v("#")]),this._v(" 并发编程-猎豹")])},function(){var e=this.$createElement,r=this._self._c||e;return r("p",[r("strong",[this._v("并发包")])])},function(){var e=this.$createElement,r=this._self._c||e;return r("p",[r("strong",[this._v("锁:")])])},function(){var e=this.$createElement,r=this._self._c||e;return r("p",[r("strong",[this._v("并发编程:")])])}],!1,null,null,null);a.options.__file="并发编程-猎豹.md";r.default=a.exports}}]);

================================================
FILE: .vuepress/dist/assets/js/57.99528377.js
================================================
(window.webpackJsonp=window.webpackJsonp||[]).push([[57],{222:function(e,r,t){"use strict";t.r(r);var n=t(0),a=Object(n.a)({},function(){var e=this,r=e.$createElement,t=e._self._c||r;return t("div",{staticClass:"content"},[e._m(0),e._v(" "),e._m(1),e._v(" "),t("ul",[t("li",[t("a",{attrs:{href:"https://www.jianshu.com/p/afbf3444db19",target:"_blank",rel:"noopener noreferrer"}},[e._v("HierarchyViewer"),t("OutboundLink")],1)]),e._v(" "),t("li",[t("a",{attrs:{href:"http://blog.csdn.net/u011240877/article/details/54347396",target:"_blank",rel:"noopener noreferrer"}},[e._v("TraceView"),t("OutboundLink")],1)]),e._v(" "),t("li",[t("a",{attrs:{href:"http://blog.csdn.net/hfreeman2008/article/details/53538155",target:"_blank",rel:"noopener noreferrer"}},[e._v("Systrace"),t("OutboundLink")],1)]),e._v(" "),t("li",[t("a",{attrs:{href:"http://gityuan.com/2016/01/17/systrace/",target:"_blank",rel:"noopener noreferrer"}},[e._v("性能工具Systrace"),t("OutboundLink")],1)]),e._v(" "),t("li",[t("a",{attrs:{href:"https://zhuanlan.zhihu.com/p/27331842",target:"_blank",rel:"noopener noreferrer"}},[e._v("手把手教你使用Systrace(一)"),t("OutboundLink")],1)]),e._v(" "),t("li",[t("a",{attrs:{href:"https://zhuanlan.zhihu.com/p/27535205",target:"_blank",rel:"noopener noreferrer"}},[e._v("手把手教你使用Systrace(二)——锁优化"),t("OutboundLink")],1)])]),e._v(" "),e._m(2),e._v(" "),t("ul",[t("li",[t("a",{attrs:{href:"http://developer.51cto.com/art/201511/496263.htm",target:"_blank",rel:"noopener noreferrer"}},[e._v("Java 代码性能优化"),t("OutboundLink")],1)]),e._v(" "),t("li",[t("a",{attrs:{href:"https://www.cnblogs.com/jianzh5/p/6437315.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("JAVA线程池调优"),t("OutboundLink")],1)]),e._v(" "),t("li",[t("a",{attrs:{href:"http://blog.csdn.net/luofenghan/article/details/78596950",target:"_blank",rel:"noopener noreferrer"}},[e._v("Java多线程引发的性能问题以及调优策略"),t("OutboundLink")],1)])]),e._v(" "),e._m(3),e._v(" "),t("ul",[t("li",[t("a",{attrs:{href:"https://tech.meituan.com/hertz.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("移动端性能监控方案Hertz"),t("OutboundLink")],1)]),e._v(" "),t("li",[t("a",{attrs:{href:"http://www.androidperformance.com/2018/05/07/Android-performance-optimization-skills-and-tools/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Android 性能优化必知必会"),t("OutboundLink")],1)])]),e._v(" "),e._m(4),e._v(" "),t("ul",[t("li",[t("a",{attrs:{href:"https://blog.csdn.net/u012124438/article/details/74617649",target:"_blank",rel:"noopener noreferrer"}},[e._v("Android性能优化系列之电量优化"),t("OutboundLink")],1)]),e._v(" "),t("li",[t("a",{attrs:{href:"https://tech.meituan.com/Dianping_Shortvideo_Battery_TestCase.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("大众点评App的短视频耗电量优化实战"),t("OutboundLink")],1)])]),e._v(" "),e._m(5),e._v(" "),t("ul",[t("li",[t("a",{attrs:{href:"http://chuansong.me/n/1365714451480",target:"_blank",rel:"noopener noreferrer"}},[e._v("腾讯TMQ团队移动App的网络优化:24小时流量优化到原来15%历程"),t("OutboundLink")],1)])]),e._v(" "),t("h4",{attrs:{id:"android性能优化典范-第1季"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#android性能优化典范-第1季","aria-hidden":"true"}},[e._v("#")]),e._v(" "),t("a",{attrs:{href:"http://hukai.me/android-performance-patterns/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Android性能优化典范 - 第1季"),t("OutboundLink")],1)]),e._v(" "),e._m(6),e._v(" "),t("h4",{attrs:{id:"android性能优化典范-第2季"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#android性能优化典范-第2季","aria-hidden":"true"}},[e._v("#")]),e._v(" "),t("a",{attrs:{href:"http://hukai.me/android-performance-patterns-season-2/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Android性能优化典范 - 第2季"),t("OutboundLink")],1)]),e._v(" "),e._m(7),e._v(" "),t("h4",{attrs:{id:"android性能优化典范-第3季"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#android性能优化典范-第3季","aria-hidden":"true"}},[e._v("#")]),e._v(" "),t("a",{attrs:{href:"http://hukai.me/android-performance-patterns-season-3/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Android性能优化典范 - 第3季"),t("OutboundLink")],1)]),e._v(" "),e._m(8),e._v(" "),t("h4",{attrs:{id:"android性能优化典范-第4季"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#android性能优化典范-第4季","aria-hidden":"true"}},[e._v("#")]),e._v(" "),t("a",{attrs:{href:"http://hukai.me/android-performance-patterns-season-4/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Android性能优化典范 - 第4季"),t("OutboundLink")],1)]),e._v(" "),e._m(9),e._v(" "),t("h4",{attrs:{id:"android性能优化典范-第5季"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#android性能优化典范-第5季","aria-hidden":"true"}},[e._v("#")]),e._v(" "),t("a",{attrs:{href:"http://hukai.me/android-performance-patterns-season-5/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Android性能优化典范 - 第5季"),t("OutboundLink")],1)]),e._v(" "),e._m(10),e._v(" "),t("h4",{attrs:{id:"android性能优化典范-第6季"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#android性能优化典范-第6季","aria-hidden":"true"}},[e._v("#")]),e._v(" "),t("a",{attrs:{href:"http://hukai.me/android-performance-patterns-season-6/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Android性能优化典范 - 第6季"),t("OutboundLink")],1)]),e._v(" "),e._m(11),e._v(" "),t("h4",{attrs:{id:"官方性能优化系列教程"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#官方性能优化系列教程","aria-hidden":"true"}},[e._v("#")]),e._v(" "),t("a",{attrs:{href:"https://www.youtube.com/playlist?list=PLWz5rJ2EKKc9CBxr3BVjPTPoDPLdPIFCE",target:"_blank",rel:"noopener noreferrer"}},[e._v("官方性能优化系列教程"),t("OutboundLink")],1)])])},[function(){var e=this.$createElement,r=this._self._c||e;return r("h3",{attrs:{id:"性能优化"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#性能优化","aria-hidden":"true"}},[this._v("#")]),this._v(" 性能优化")])},function(){var e=this.$createElement,r=this._self._c||e;return r("h4",{attrs:{id:"工具"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#工具","aria-hidden":"true"}},[this._v("#")]),this._v(" 工具")])},function(){var e=this.$createElement,r=this._self._c||e;return r("h3",{attrs:{id:"java-层面"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#java-层面","aria-hidden":"true"}},[this._v("#")]),this._v(" Java 层面")])},function(){var e=this.$createElement,r=this._self._c||e;return r("h3",{attrs:{id:"android"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#android","aria-hidden":"true"}},[this._v("#")]),this._v(" Android")])},function(){var e=this.$createElement,r=this._self._c||e;return r("p",[r("strong",[this._v("耗电")])])},function(){var e=this.$createElement,r=this._self._c||e;return r("p",[r("strong",[this._v("流量")])])},function(){var e=this,r=e.$createElement,t=e._self._c||r;return t("ol",[t("li",[t("strong",[e._v("Render Performance")]),e._v(" Android系统每隔16ms发出VSYNC信号,触发对UI进行渲染,如果每次渲染都成功,这样就能够达到流畅的画面所需要的60fps,为了能够实现60fps,这意味着程序的大多数操作都必须在16ms内完成。我们可以通过一些工具来定位问题,比如可以使用HierarchyViewer来查找Activity中的布局是否过于复杂,也可以使用手机设置里面的开发者选项,打开Show GPU Overdraw等选项进行观察。你还可以使用TraceView来观察CPU的执行情况,更加快捷的找到性能瓶颈。")]),e._v(" "),t("li",[t("strong",[e._v("Understanding Overdraw")]),e._v(" Overdraw(过度绘制)描述的是屏幕上的某个像素在同一帧的时间内被绘制了多次。在多层次的UI结构里面,如果不可见的UI也在做绘制的操作,这就会导致某些像素区域被绘制了多次。这就浪费大量的CPU以及GPU资源。Overdraw有时候是因为你的UI布局存在大量重叠的部分,还有的时候是因为非必须的重叠背景。例如某个Activity有一个背景,然后里面的Layout又有自己的背景,同时子View又分别有自己的背景。仅仅是通过移除非必须的背景图片,这就能够减少大量的红色Overdraw区域,增加蓝色区域的占比。这一措施能够显著提升程序性能。")]),e._v(" "),t("li",[t("strong",[e._v("Understanding VSYNC")]),e._v(" Refresh Rate:代表了屏幕在一秒内刷新屏幕的次数,这取决于硬件的固定参数,例如60Hz。Frame Rate:代表了GPU在一秒内绘制操作的帧数,例如30fps,60fps。通常来说,帧率超过刷新频率只是一种理想的状况,在超过60fps的情况下,GPU所产生的帧数据会因为等待VSYNC的刷新信息而被Hold住,这样能够保持每次刷新都有实际的新的数据可以显示。但是我们遇到更多的情况是帧率小于刷新频率。")]),e._v(" "),t("li",[t("strong",[e._v("Tool:Profile GPU Rendering")]),e._v(" 性能问题如此的麻烦,幸好我们可以有工具来进行调试。打开手机里面的开发者选项,选择Profile GPU Rendering,选中On screen as bars的选项。")]),e._v(" "),t("li",[t("strong",[e._v("Why 60fps?")]),e._v(" 我们通常都会提到60fps与16ms,可是知道为何会是以程序是否达到60fps来作为App性能的衡量标准吗?这是因为人眼与大脑之间的协作无法感知超过60fps的画面更新。开发app的性能目标就是保持60fps,这意味着每一帧你只有16ms=1000/60的时间来处理所有的任务。")]),e._v(" "),t("li",[t("strong",[e._v("Android, UI and the GPU")]),e._v(" 在Android里面那些由主题所提供的资源,例如Bitmaps,Drawables都是一起打包到统一的Texture纹理当中,然后再传递到GPU里面,这意味着每次你需要使用这些资源的时候,都是直接从纹理里面进行获取渲染的。当然随着UI组件的越来越丰富,有了更多演变的形态。例如显示图片的时候,需要先经过CPU的计算加载到内存中,然后传递给GPU进行渲染。文字的显示更加复杂,需要先经过CPU换算成纹理,然后再交给GPU进行渲染,回到CPU绘制单个字符的时候,再重新引用经过GPU渲染的内容。动画则是一个更加复杂的操作流程。为了能够使得App流畅,我们需要在每一帧16ms以内处理完所有的CPU与GPU计算,绘制,渲染等等操作。")]),e._v(" "),t("li",[t("strong",[e._v("Invalidations, Layouts, and Performance")]),e._v(" 任何时候View中的绘制内容发生变化时,都会重新执行创建DisplayList,渲染DisplayList,更新到屏幕上等一系列操作。这个流程的表现性能取决于你的View的复杂程度,View的状态变化以及渲染管道的执行性能。举个例子,假设某个Button的大小需要增大到目前的两倍,在增大Button大小之前,需要通过父View重新计算并摆放其他子View的位置。修改View的大小会触发整个HierarcyView的重新计算大小的操作。如果是修改View的位置则会触发HierarchView重新计算其他View的位置。如果布局很复杂,这就会很容易导致严重的性能问题。我们需要尽量减少Overdraw。")]),e._v(" "),t("li",[t("strong",[e._v("Overdraw, Cliprect, QuickReject")]),e._v(" 我们可以通过canvas.clipRect()来帮助系统识别那些可见的区域。这个方法可以指定一块矩形区域,只有在这个区域内才会被绘制,其他的区域会被忽视。这个API可以很好的帮助那些有多组重叠组件的自定义View来控制显示的区域。同时clipRect方法还可以帮助节约CPU与GPU资源,在clipRect区域之外的绘制指令都不会被执行,那些部分内容在矩形区域内的组件,仍然会得到绘制。")]),e._v(" "),t("li",[t("strong",[e._v("Memory Churn and performance")]),e._v(" 执行GC操作的时候,所有线程的任何操作都会需要暂停,等待GC操作完成之后,其他操作才能够继续运行。Memory Churn内存抖动,内存抖动是因为大量的对象被创建又在短时间内马上被释放。瞬间产生大量的对象会严重占用Young Generation的内存区域,当达到阀值,剩余空间不够的时候,也会触发GC。即使每次分配的对象占用了很少的内存,但是他们叠加在一起会增加Heap的压力,从而触发更多其他类型的GC。这个操作有可能会影响到帧率,并使得用户感知到性能问题。")]),e._v(" "),t("li",[t("strong",[e._v("Garbage Collection in Android")]),e._v(" 原始JVM中的GC机制在Android中得到了很大程度上的优化。Android里面是一个三级Generation的内存模型,最近分配的对象会存放在Young Generation区域,当这个对象在这个区域停留的时间达到一定程度,它会被移动到Old Generation,最后到Permanent Generation区域。如果不小心在最小的for循环单元里面执行了创建对象的操作,这将很容易引起GC并导致性能问题。通过Memory Monitor我们可以查看到内存的占用情况,每一次瞬间的内存降低都是因为此时发生了GC操作,如果在短时间内发生大量的内存上涨与降低的事件,这说明很有可能这里有性能问题。我们还可以通过Heap and Allocation Tracker工具来查看此时内存中分配的到底有哪些对象。")]),e._v(" "),t("li",[t("strong",[e._v("Performance Cost of Memory Leaks")]),e._v(" 内存泄漏指的是那些程序不再使用的对象无法被GC识别,这样就导致这个对象一直留在内存当中,占用了宝贵的内存空间。显然,这还使得每级Generation的内存区域可用空间变小,GC就会更容易被触发,从而引起性能问题。")]),e._v(" "),t("li",[t("strong",[e._v("Memory Performance")]),e._v(" 通常来说,Android对GC做了大量的优化操作,虽然执行GC操作的时候会暂停其他任务,可是大多数情况下,GC操作还是相对很安静并且高效的。但是如果我们对内存的使用不恰当,导致GC频繁执行,这样就会引起不小的性能问题。")]),e._v(" "),t("li",[t("strong",[e._v("Tool - Memory Monitor")]),e._v(" Android Studio中的Memory Monitor可以很好的帮助我们查看程序的内存使用情况。")]),e._v(" "),t("li",[t("strong",[e._v("Battery Performance")]),e._v(" 我们应该尽量减少唤醒屏幕的次数与持续的时间,使用WakeLock来处理唤醒的问题,能够正确执行唤醒操作并根据设定及时关闭操作进入睡眠状态。某些非必须马上执行的操作,例如上传歌曲,图片处理等,可以等到设备处于充电状态或者电量充足的时候才进行。触发网络请求的操作,每次都会保持无线信号持续一段时间,我们可以把零散的网络请求打包进行一次操作,避免过多的无线信号引起的电量消耗。关于网络请求引起无线信号的电量消耗")]),e._v(" "),t("li",[t("strong",[e._v("Understanding Battery Drain on Android")]),e._v(" 使用WakeLock或者JobScheduler唤醒设备处理定时的任务之后,一定要及时让设备回到初始状态。每次唤醒无线信号进行数据传递,都会消耗很多电量,它比WiFi等操作更加的耗电")]),e._v(" "),t("li",[t("strong",[e._v("Battery Drain and WakeLocks")]),e._v(" 这正是JobScheduler API所做的事情。它会根据当前的情况与任务,组合出理想的唤醒时间,例如等到正在充电或者连接到WiFi的时候,或者集中任务一起执行。我们可以通过这个API实现很多免费的调度算法。")])])},function(){var e=this,r=e.$createElement,t=e._self._c||r;return t("ol",[t("li",[t("strong",[e._v("Battery Drain and Networking")]),e._v(" 我们可以有针对性的把请求行为捆绑起来,延迟到某个时刻统一发起请求。这部分主要会涉及到Prefetch(预取)与Compressed(压缩)这两个技术。对于Prefetch的使用,我们需要预先判断用户在此次操作之后,后续零散的请求是否很有可能会马上被触发,可以把后面5分钟有可能会使用到的零散请求都一次集中执行完毕。对于Compressed的使用,在上传与下载数据之前,使用CPU对数据进行压缩与解压,可以很大程度上减少网络传输的时间。")]),e._v(" "),t("li",[t("strong",[e._v("Wear & Sensors")]),e._v(" 首先我们需要尽量使用Android平台提供的既有运动数据,而不是自己去实现监听采集数据,因为大多数Android Watch自身记录Sensor数据的行为是有经过做电量优化的。其次在Activity不需要监听某些Sensor数据的时候需要尽快释放监听注册。还有我们需要尽量控制更新的频率,仅仅在需要刷新显示数据的时候才触发获取最新数据的操作。另外我们可以针对Sensor的数据做批量处理,待数据累积一定次数或者某个程度的时候才更新到UI上。最后当Watch与Phone连接起来的时候,可以把某些复杂操作的事情交给Phone来执行,Watch只需要等待返回的结果。")]),e._v(" "),t("li",[t("strong",[e._v("Smooth Android Wear Animation")]),e._v(" 在Android里面一个相对操作比较繁重的事情是对Bitmap进行旋转,缩放,裁剪等等。例如在一个圆形的钟表图上,我们把时钟的指针抠出来当做单独的图片进行旋转会比旋转一张完整的圆形图的所形成的帧率要高56%。")]),e._v(" "),t("li",[t("strong",[e._v("Android Wear Data Batching")]),e._v(" 仅仅在真正需要刷新界面的时候才发出请求,尽量把计算复杂操作的任务交给Phone来处理,Phone仅仅在数据发生变化的时候才通知到Wear,把零碎的数据请求捆绑一起再进行操作。")]),e._v(" "),t("li",[t("strong",[e._v("Object Pools")]),e._v(" 使用对象池技术有很多好处,它可以避免内存抖动,提升性能,但是在使用的时候有一些内容是需要特别注意的。通常情况下,初始化的对象池里面都是空白的,当使用某个对象的时候先去对象池查询是否存在,如果不存在则创建这个对象然后加入对象池,但是我们也可以在程序刚启动的时候就事先为对象池填充一些即将要使用到的数据,这样可以在需要使用到这些对象的时候提供更快的首次加载速度,这种行为就叫做预分配。使用对象池也有不好的一面,程序员需要手动管理这些对象的分配与释放,所以我们需要慎重地使用这项技术,避免发生对象的内存泄漏。为了确保所有的对象能够正确被释放,我们需要保证加入对象池的对象和其他外部对象没有互相引用的关系。")]),e._v(" "),t("li",[t("strong",[e._v("To Index or Iterate?")]),e._v(" for index的方式有更好的效率,但是因为不同平台编译器优化各有差异,我们最好还是针对实际的方法做一下简单的测量比较好,拿到数据之后,再选择效率最高的那个方式。")]),e._v(" "),t("li",[t("strong",[e._v("The Magic of LRU Cache")]),e._v(" 使用LRU Cache能够显著提升应用的性能,可是也需要注意LRU Cache中被淘汰对象的回收,否者会引起严重的内存泄露。")]),e._v(" "),t("li",[t("strong",[e._v("Using LINT for Performance Tips")]),e._v(" Lint已经集成到Android Studio中了,我们可以手动去触发这个工具,点击工具栏的Analysis -> Inspect Code,触发之后,Lint会开始工作,并把结果输出到底部的工具栏,我们可以逐个查看原因并根据指示做相应的优化修改。")]),e._v(" "),t("li",[t("strong",[e._v("Hidden Cost of Transparency")]),e._v(" 通常来说,对于不透明的View,显示它只需要渲染一次即可,可是如果这个View设置了alpha值,会至少需要渲染两次。")]),e._v(" "),t("li",[t("strong",[e._v("Avoiding Allocations in onDraw()")]),e._v(" 首先onDraw()方法是执行在UI线程的,在UI线程尽量避免做任何可能影响到性能的操作。虽然分配内存的操作并不需要花费太多系统资源,但是这并不意味着是免费无代价的。设备有一定的刷新频率,导致View的onDraw方法会被频繁的调用,如果onDraw方法效率低下,在频繁刷新累积的效应下,效率低的问题会被扩大,然后会对性能有严重的影响。")]),e._v(" "),t("li",[t("strong",[e._v("Tool: Strict Mode")]),e._v(" Android提供了一个叫做Strict Mode的工具,我们可以通过手机设置里面的开发者选项,打开Strict Mode选项,如果程序存在潜在的隐患,屏幕就会闪现红色。我们也可以通过StrictMode API在代码层面做细化的跟踪,可以设置StrictMode监听那些潜在问题,出现问题时如何提醒开发者,可以对屏幕闪红色,也可以输出错误日志。")]),e._v(" "),t("li",[t("strong",[e._v("Custom Views and Performance")]),e._v(" Useless calls to onDraw():我们知道调用View.invalidate()会触发View的重绘,有两个原则需要遵守,第1个是仅仅在View的内容发生改变的时候才去触发invalidate方法,第2个是尽量使用ClipRect等方法来提高绘制的性能。Useless pixels:减少绘制时不必要的绘制元素,对于那些不可见的元素,我们需要尽量避免重绘。Wasted CPU cycles:对于不在屏幕上的元素,可以使用Canvas.quickReject把他们给剔除,避免浪费CPU资源。另外尽量使用GPU来进行UI的渲染,这样能够极大的提高程序的整体表现性能。")]),e._v(" "),t("li",[t("strong",[e._v("Batching Background Work Until Later")]),e._v("\n1.AlarmManager 使用AlarmManager设置定时任务,可以选择精确的间隔时间,也可以选择非精确时间作为参数。除非程序有很强烈的需要使用精确的定时唤醒,否者一定要避免使用他,我们应该尽量使用非精确的方式。2.SyncAdapter 我们可以使用SyncAdapter为应用添加设置账户,这样在手机设置的账户列表里面可以找到我们的应用。这种方式功能更多,但是实现起来比较复杂。我们可以从这里看到官方的培训课程:http://developer.android.com/training/sync-adapters/index.html 3.JobSchedulor 这是最简单高效的方法,我们可以设置任务延迟的间隔,执行条件,还可以增加重试机制。")]),e._v(" "),t("li",[t("strong",[e._v("Smaller Pixel Formats")]),e._v(" Android的Heap空间是不会自动做兼容压缩的,意思就是如果Heap空间中的图片被收回之后,这块区域并不会和其他已经回收过的区域做重新排序合并处理,那么当一个更大的图片需要放到heap之前,很可能找不到那么大的连续空闲区域,那么就会触发GC,使得heap腾出一块足以放下这张图片的空闲区域,如果无法腾出,就会发生OOM。")]),e._v(" "),t("li",[t("strong",[e._v("Smaller PNG Files")]),e._v(" 尽量减少PNG图片的大小是Android里面很重要的一条规范。相比起JPEG,PNG能够提供更加清晰无损的图片,但是PNG格式的图片会更大,占用更多的磁盘空间。到底是使用PNG还是JPEG,需要设计师仔细衡量,对于那些使用JPEG就可以达到视觉效果的,可以考虑采用JPEG即可。")]),e._v(" "),t("li",[t("strong",[e._v("Pre-scaling Bitmaps")]),e._v(" 对bitmap做缩放,这也是Android里面最遇到的问题。对bitmap做缩放的意义很明显,提示显示性能,避免分配不必要的内存。Android提供了现成的bitmap缩放的API,叫做createScaledBitmap()")]),e._v(" "),t("li",[t("strong",[e._v("Re-using Bitmaps")]),e._v(" 使用inBitmap属性可以告知Bitmap解码器去尝试使用已经存在的内存区域,新解码的bitmap会尝试去使用之前那张bitmap在heap中所占据的pixel data内存区域,而不是去问内存重新申请一块区域来存放bitmap。利用这种特性,即使是上千张的图片,也只会仅仅只需要占用屏幕所能够显示的图片数量的内存大小。")]),e._v(" "),t("li",[t("strong",[e._v("The Performance Lifecycle")]),e._v(" Gather:收集数据,Insight:分析数据,Action:解决问题")])])},function(){var e=this,r=e.$createElement,t=e._self._c||r;return t("ol",[t("li",[t("strong",[e._v("Fun with ArrayMaps")]),e._v(" 为了解决HashMap更占内存的弊端,Android提供了内存效率更高的ArrayMap。它内部使用两个数组进行工作,其中一个数组记录key hash过后的顺序列表,另外一个数组按key的顺序记录Key-Value值")]),e._v(" "),t("li",[t("strong",[e._v("Beware Autoboxing")]),e._v(" 有时候性能问题也可能是因为那些不起眼的小细节引起的,例如在代码中不经意的“自动装箱”。我们知道基础数据类型的大小:boolean(8 bits), int(32 bits), float(32 bits),long(64 bits),为了能够让这些基础数据类型在大多数Java容器中运作,会需要做一个autoboxing的操作,转换成Boolean,Integer,Float等对象")]),e._v(" "),t("li",[t("strong",[e._v("SparseArray Family Ties")]),e._v(" 为了避免HashMap的autoboxing行为,Android系统提供了SparseBoolMap,SparseIntMap,SparseLongMap,LongSparseMap等容器。")]),e._v(" "),t("li",[t("strong",[e._v("The price of ENUMs")]),e._v(" Android官方强烈建议不要在Android程序里面使用到enum。")]),e._v(" "),t("li",[t("strong",[e._v("Trimming and Sharing Memory")]),e._v(" Android系统提供了一些回调来通知应用的内存使用情况,通常来说,当所有的background应用都被kill掉的时候,forground应用会收到onLowMemory()的回调。在这种情况下,需要尽快释放当前应用的非必须内存资源,从而确保系统能够稳定继续运行。Android系统还提供了onTrimMemory()的回调,当系统内存达到某些条件的时候,所有正在运行的应用都会收到这个回调")]),e._v(" "),t("li",[t("strong",[e._v("DO NOT LEAK VIEWS")]),e._v(" 避免使用异步回调,避免使用Static对象,避免把View添加到没有清除机制的容器里面")]),e._v(" "),t("li",[t("strong",[e._v("Location & Battery Drain")]),e._v(" 其中存在的一个优化点是,我们可以通过判断返回的位置信息是否相同,从而决定设置下次的更新间隔是否增加一倍,通过这种方式可以减少电量的消耗")]),e._v(" "),t("li",[t("strong",[e._v("Double Layout Taxation")]),e._v(" 布局中的任何一个View一旦发生一些属性变化,都可能引起很大的连锁反应。例如某个button的大小突然增加一倍,有可能会导致兄弟视图的位置变化,也有可能导致父视图的大小发生改变。当大量的layout()操作被频繁调用执行的时候,就很可能引起丢帧的现象。")]),e._v(" "),t("li",[t("strong",[e._v("Network Performance 101")]),e._v(" 减少移动网络被激活的时间与次数,压缩传输数据")]),e._v(" "),t("li",[t("strong",[e._v("Effective Network Batching")]),e._v(" 发起网络请求与接收返回数据都是比较耗电的,在网络硬件模块被激活之后,会继续保持几十秒的电量消耗,直到没有新的网络操作行为之后,才会进入休眠状态。前面一个段落介绍了使用Batching的技术来捆绑网络请求,从而达到减少网络请求的频率。那么如何实现Batching技术呢?通常来说,我们可以会把那些发出的网络请求,先暂存到一个PendingQueue里面,等到条件合适的时候再触发Queue里面的网络请求。")]),e._v(" "),t("li",[t("strong",[e._v("Optimizing Network Request Frequencies")]),e._v(" 前面的段落已经提到了应该减少网络请求的频率,这是为了减少电量的消耗。我们可以使用Batching,Prefetching的技术来避免频繁的网络请求。Google提供了GCMNetworkManager来帮助开发者实现那些功能,通过提供的API,我们可以选择在接入WiFi,开始充电,等待移动网络被激活等条件下再次激活网络请求。")]),e._v(" "),t("li",[t("strong",[e._v("Effective Prefetching")]),e._v(" 类似上面的情况会频繁触发网络请求,但是如果我们能够预先请求后续可能会使用到网络资源,避免频繁的触发网络请求,这样就能够显著的减少电量的消耗。可是预先获取多少数据量是很值得考量的,因为如果预取数据量偏少,就起不到减少频繁请求的作用,可是如果预取数据过多,就会造成资源的浪费。")])])},function(){var e=this,r=e.$createElement,t=e._self._c||r;return t("ol",[t("li",[t("strong",[e._v("Cachematters for networking")]),e._v(" 想要使得Android系统上的网络访问操作更加的高效就必须做好网络数据的缓存。这是提高网络访问性能最基础的步骤之一。从手机的缓存中直接读取数据肯定比从网络上获取数据要更加的便捷高效,特别是对于那些会被频繁访问到的数据,需要把这些数据缓存到设备上,以便更加快速的进行访问。")]),e._v(" "),t("li",[t("strong",[e._v("Optimizing Network Request Frequencies")]),e._v(" 首先我们要对网络行为进行分类,区分需要立即更新数据的行为和其他可以进行延迟的更新行为,为不同的场景进行差异化处理。其次要避免客户端对服务器的轮询操作,这样会浪费很多的电量与带宽流量。解决这个问题,我们可以使用Google Cloud Message来对更新的数据进行推送。然后在某些必须做同步的场景下,需要避免使用固定的间隔频率来进行更新操作,我们应该在返回的数据无更新的时候,使用双倍的间隔时间来进行下一次同步。最后更进一步,我们还可以通过判断当前设备的状态来决定同步的频率,例如判断设备处于休眠,运动等不同的状态设计各自不同时间间隔的同步频率。")]),e._v(" "),t("li",[t("strong",[e._v("Effective Prefetching")]),e._v(" 到底预取多少才比较合适呢?一个比较普适的规则是,在3G网络下可以预取1-5Mb的数据量,或者是按照提前预期后续1-2分钟的数据作为基线标准。在实际的操作当中,我们还需要考虑当前的网络速度来决定预取的数据量,例如在同样的时间下,4G网络可以获取到12张图片的数据,而2G网络则只能拿到3张图片的数据。所以,我们还需要把当前的网络环境情况添加到设计预取数据量的策略当中去。判断当前设备的状态与网络情况,可以使用前面提到过的GCMNetworkManager。")]),e._v(" "),t("li",[t("strong",[e._v("Adapting to Latency")]),e._v(" 一个典型的网络操作行为,通常包含以下几个步骤:首先手机端发起网络请求,到达网络服务运营商的基站,再转移到服务提供者的服务器上,经过解码之后,接着访问本地的存储数据库,获取到数据之后,进行编码,最后按照原来传递的路径逐层返回。常来说,我们可以把网络请求延迟划分为三档:例如把网络延迟小于60ms的划分为GOOD,大于220ms的划分为BAD,介于两者之间的划分为OK(这里的60ms,220ms会需要根据不同的场景提前进行预算推测)。")]),e._v(" "),t("li",[t("strong",[e._v("Minimizing Asset Payload")]),e._v(" 为了能够减小网络传输的数据量,我们需要对传输的数据做压缩的处理,这样能够提高网络操作的性能。首先需要做的是减少图片的大小,其次需要做的是减少序列化数据的大小。")]),e._v(" "),t("li",[t("strong",[e._v("Service Performance Patterns")]),e._v(" Service是Android程序里面最常用的基础组件之一,但是使用Service很容易引起电量的过度消耗以及系统资源的未及时释放。避免错误的使用Service,例如我们不应该使用Service来监听某些事件的变化,不应该搞一个Service在后台对服务器不断的进行轮询(应该使用Google Cloud Messaging)。如果已经事先知道Service里面的任务应该执行在后台线程(非默认的主线程)的时候,我们应该使用IntentService或者结合HanderThread,AsycnTask Loader实现的Service。")]),e._v(" "),t("li",[t("strong",[e._v("Removing unused code")]),e._v(" Android为我们提供了Proguard的工具来帮助应用程序对代码进行瘦身,优化,混淆的处理。它会帮助移除那些没有使用到的代码,还可以对类名,方法名进行混淆处理以避免程序被反编译。")]),e._v(" "),t("li",[t("strong",[e._v("Removing unused resources")]),e._v(" 所幸的是,我们可以使用Gradle来帮助我们分析代码,分析引用的资源,对于那些没有被引用到的资源,会在编译阶段被排除在APK安装包之外,要实现这个功能,对我们来说仅仅只需要在build.gradle文件中配置shrinkResource为true就好了")]),e._v(" "),t("li",[t("strong",[e._v("Perf Theory: Caching")]),e._v(" 当我们讨论性能优化的时候,缓存是最常见最有效的策略之一。无论是为了提高CPU的计算速度还是提高数据的访问速度,在绝大多数的场景下,我们都会使用到缓存。")]),e._v(" "),t("li",[t("strong",[e._v("Perf Theory: Approximation(近似法)")]),e._v(" 例如使用一张比较接近实际大小的图片来替代原图,换取更快的加载速度。所以对于那些对计算结果要求不需要十分精确的场景,我们可以使用近似法则来提高程序的性能。")]),e._v(" "),t("li",[t("strong",[e._v("Perf Theory: Culling(遴选,挑选)")]),e._v(" 一个提高性能的方法是逐步对数据进行过滤筛选,减小搜索的数据集,以此提高程序的执行性能。例如我们需要搜索到居住在某个地方,年龄是多少,符合某些特定条件的候选人,就可以通过逐层过滤筛选的方式来提高后续搜索的执行效率。")]),e._v(" "),t("li",[t("strong",[e._v("Perf Theory: Threading")]),e._v(" 使用多线程并发处理任务,从某种程度上可以快速提高程序的执行性能。对于Android程序来说,主线程通常也成为UI线程,需要处理UI的渲染,响应用户的操作等等。")]),e._v(" "),t("li",[t("strong",[e._v("Perf Theory: Batching")]),e._v(" 网络请求的批量执行是另外一个比较适合说明batching使用场景的例子,因为每次发起网络请求都相对来说比较耗时耗电,如果能够做到批量一起执行,可以大大的减少电量的消耗。")]),e._v(" "),t("li",[t("strong",[e._v("Serialization performance")]),e._v(" 数据序列化的行为可能发生在数据传递过程中的任何阶段,例如网络传输,不同进程间数据传递,不同类之间的参数传递,把数据存储到磁盘上等等。通常情况下,我们会把那些需要序列化的类实现Serializable接口(如下图所示),但是这种传统的做法效率不高,实施的过程会消耗更多的内存。但是我们如果使用GSON库来处理这个序列化的问题,不仅仅执行速度更快,内存的使用效率也更高。Android的XML布局文件会在编译的阶段被转换成更加复杂的格式,具备更加高效的执行性能与更高的内存使用效率。")]),e._v(" "),t("li",[t("strong",[e._v("Smaller Serialized Data")]),e._v(" 数据呈现的顺序以及结构会对序列化之后的空间产生不小的影响。")]),e._v(" "),t("li",[t("strong",[e._v("Caching UI data")]),e._v(" 缓存UI界面上的数据,可以采用方案有存储到文件系统,Preference,SQLite等等,做了缓存之后,这样就可以在请求数据返回结果之前,呈现给用户旧的数据,而不是使用正在加载的方式让用户什么数据都看不到,当然在请求网络最新数据的过程中,需要有正在刷新的提示。至于到底选择哪个方案来对数据进行缓存,就需要根据具体情况来做选择了。")]),e._v(" "),t("li",[t("strong",[e._v("CPU Frequency Scaling")]),e._v(" 调节CPU的频率会执行的性能产生较大的影响,为了最大化的延长设备的续航时间,系统会动态调整CPU的频率,频率越高执行代码的速度自然就越快。我们可以使用Systrace工具来导出CPU的执行情况,以便帮助定位性能问题。")])])},function(){var e=this,r=e.$createElement,t=e._self._c||r;return t("ol",[t("li",[t("strong",[e._v("Threading Performance")]),e._v(" AsyncTask: 为UI线程与工作线程之间进行快速的切换提供一种简单便捷的机制。适用于当下立即需要启动,但是异步执行的生命周期短暂的使用场景。HandlerThread: 为某些回调方法或者等待某些任务的执行设置一个专属的线程,并提供线程任务的调度机制。ThreadPool: 把任务分解成不同的单元,分发到各个不同的线程上,进行同时并发处理。IntentService: 适合于执行由UI触发的后台Service任务,并可以把后台任务执行的情况通过一定的机制反馈给UI。")]),e._v(" "),t("li",[t("strong",[e._v("Understanding Android Threading")]),e._v(" 通常来说,一个线程需要经历三个生命阶段:开始,执行,结束。线程会在任务执行完毕之后结束,那么为了确保线程的存活,我们会在执行阶段给线程赋予不同的任务,然后在里面添加退出的条件从而确保任务能够执行完毕后退出。")]),e._v(" "),t("li",[t("strong",[e._v("Memory & Threading")]),e._v(" 不要在任何非UI线程里面去持有UI对象的引用。系统为了确保所有的UI对象都只会被UI线程所进行创建,更新,销毁的操作,特地设计了对应的工作机制(当Activity被销毁的时候,由该Activity所触发的非UI线程都将无法对UI对象进行操作,否者就会抛出程序执行异常的错误)来防止UI对象被错误的使用。")]),e._v(" "),t("li",[t("strong",[e._v("Good AsyncTask Hunting")]),e._v(" AsyncTask虽然提供了一种简单便捷的异步机制,但是我们还是很有必要特别关注到他的缺点,避免出现因为使用错误而导致的严重系统性能问题。")]),e._v(" "),t("li",[t("strong",[e._v("Getting a HandlerThread")]),e._v(" HandlerThread比较合适处理那些在工作线程执行,需要花费时间偏长的任务。我们只需要把任务发送给HandlerThread,然后就只需要等待任务执行结束的时候通知返回到主线程就好了。另外很重要的一点是,一旦我们使用了HandlerThread,需要特别注意给HandlerThread设置不同的线程优先级,CPU会根据设置的不同线程优先级对所有的线程进行调度优化。")]),e._v(" "),t("li",[t("strong",[e._v("Swimming in Threadpools")]),e._v(" 线程池适合用在把任务进行分解,并发进行执行的场景。通常来说,系统里面会针对不同的任务设置一个单独的守护线程用来专门处理这项任务。")]),e._v(" "),t("li",[t("strong",[e._v("The Zen of IntentService")]),e._v(" 默认的Service是执行在主线程的,可是通常情况下,这很容易影响到程序的绘制性能(抢占了主线程的资源)。除了前面介绍过的AsyncTask与HandlerThread,我们还可以选择使用IntentService来实现异步操作。IntentService继承自普通Service同时又在内部创建了一个HandlerThread,在onHandlerIntent()的回调里面处理扔到IntentService的任务。所以IntentService就不仅仅具备了异步线程的特性,还同时保留了Service不受主页面生命周期影响的特点。")]),e._v(" "),t("li",[t("strong",[e._v("Threading and Loaders")]),e._v(" 当启动工作线程的Activity被销毁的时候,我们应该做点什么呢?为了方便的控制工作线程的启动与结束,Android为我们引入了Loader来解决这个问题。我们知道Activity有可能因为用户的主动切换而频繁的被创建与销毁,也有可能是因为类似屏幕发生旋转等被动原因而销毁再重建。在Activity不停的创建与销毁的过程当中,很有可能因为工作线程持有Activity的View而导致内存泄漏(因为工作线程很可能持有View的强引用,另外工作线程的生命周期还无法保证和Activity的生命周期一致,这样就容易发生内存泄漏了)。除了可能引起内存泄漏之外,在Activity被销毁之后,工作线程还继续更新视图是没有意义的,因为此时视图已经不在界面上显示了。")]),e._v(" "),t("li",[t("strong",[e._v("The Importance of Thread Priority")]),e._v(" 在Android系统里面,我们可以通过android.os.Process.setThreadPriority(int)设置线程的优先级,参数范围从-20到24,数值越小优先级越高。Android系统还为我们提供了以下的一些预设值,我们可以通过给不同的工作线程设置不同数值的优先级来达到更细粒度的控制。")]),e._v(" "),t("li",[t("strong",[e._v("Profile GPU Rendering : M Update")]),e._v(" 从Android M系统开始,系统更新了GPU Profiling的工具来帮助我们定位UI的渲染性能问题。早期的CPU Profiling工具只能粗略的显示出Process,Execute,Update三大步骤的时间耗费情况。")])])},function(){var e=this,r=e.$createElement,t=e._self._c||r;return t("ol",[t("li",[t("strong",[e._v("App Launch time 101")]),e._v(" 提高程序的启动速度意义重大,很显然,启动时间越短,用户才越有耐心等待打开这个APP进行使用,反之启动时间越长,用户则越有可能来不及等到APP打开就已经切换到其他APP了。程序启动过程中的那些复杂错误的操作很可能导致严重的性能问题。Android系统会根据用户的操作行为调整程序的显示策略,用来提高程序的显示性能。例如,一旦用户点击桌面图标,Android系统会立即显示一个启动窗口,这个窗口会一直保持显示直到画面中的元素成功加载并绘制完第一帧。这种行为常见于程序的冷启动,或者程序的热启动场景(程序从后台被唤起或者从其他APP界面切换回来)。那么关键的问题是,用户很可能会因为从启动窗口到显示画面的过程耗时过长而感到厌烦,从而导致用户没有来得及等程序启动完毕就切换到其他APP了。更严重的是,如果启动时间过长,可能导致程序出现ANR。我们应该避免出现这两种糟糕的情况。")]),e._v(" "),t("li",[t("strong",[e._v("App Launch Time & Activity Creation")]),e._v(" 优化布局耗时:一个布局层级越深,里面包含需要加载的元素越多,就会耗费更多的初始化时间。关于布局性能的优化,这里就不展开描述了!异步延迟加载:一开始只初始化最需要的布局,异步加载图片,非立即需要的组件可以做延迟加载。")]),e._v(" "),t("li",[t("strong",[e._v("App Launch Time & Bloated Application Objects")]),e._v(" 优化这些问题的解决方案是做延迟加载,可以在application里面做延迟加载,也可以把一些初始化的操作延迟到组件真正被调用到的时候再做加载。")]),e._v(" "),t("li",[t("strong",[e._v("App Launch Time & Theme Launch Screens")]),e._v(" 目前大多数开发者都会通过设置启动窗口主题的方式来替换系统默认的启动窗口,通过这种方式只是使用『障眼法』弱化了用户对启动时间的感知,但本质上并没有对启动速度做什么优化。也有些APP通过关闭启动窗口属性android:windowDisablePreview的方式来直接移除系统默认的启动窗口,但是这样的弊端是用户从点击桌面图标到真的看到实际页面的这段时间当中,画面没有任何变化,这样的用户体验是十分糟糕的!")]),e._v(" "),t("li",[t("strong",[e._v("Smaller APKs: A Checklist")]),e._v(" 1)确保在build.gradle文件中开启了minifEnabled与shrinkResources的属性,这两个属性可以帮助移除那些在程序中使用不到的代码与资源,帮助减少APP的安装包大小。2)有选择性的提供对应分辨率的图片资源,系统会自动匹配最合适分辨率的图片并执行拉伸或者压缩的处理。3)在符合条件的情况下,使用Vertor Drawable替代传统的PNG/JPEG图片,能够极大的减少图片资源的大小。传统模式下,针对不同dpi的手机都需要提供一套PNG/JPEG的图片,而如果使用Vector Drawable的话,只需要一个XML文件即可。4)尽量复用已经存在的资源图片,使用代码的方式对已有的资源进行复用 5)开启MinifEnabled,Proguard。打开这些编译属性之后,程序在打包的时候就不会把没有引用到的代码编译进来,以此达到减少安装包大小的目的。6)注意因为编译行为额外产生的方法数,例如类似Enum,Protocal Buffer可能导致方法数与类的个数增加。7)部分引入到工程中的jar类库可能并不是专门针对移动端APP而设计的,他们最开始可能是运用在PC或者Server上的。使用这些类库不仅仅额外增加了包的大小,还增加了编译时间。单纯依靠Proguard可能无法完全移除那些使用不到的方法,最佳的方式是使用一些更加轻量化,专门为Android APP设计的jar类库。")]),e._v(" "),t("li",[t("strong",[e._v("VectorDrawable for smaller APKs")]),e._v(" 针对不同的分辨率提供多张精度的图片会额外增加APK的大小,针对这个问题的解决方案是考虑使用VectorDrawable,它仅仅只需要一个文件,能够动态生成对应分辨率的图片。")])])}],!1,null,null,null);a.options.__file="性能优化.md";r.default=a.exports}}]);

================================================
FILE: .vuepress/dist/assets/js/58.e0be91a5.js
================================================
(window.webpackJsonp=window.webpackJsonp||[]).push([[58],{223:function(t,n,a){"use strict";a.r(n);var i=a(0),v=Object(i.a)({},function(){this.$createElement;this._self._c;return this._m(0)},[function(){var t=this,n=t.$createElement,a=t._self._c||n;return a("div",{staticClass:"content"},[a("h4",{attrs:{id:"抽象类接口区别-360"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#抽象类接口区别-360","aria-hidden":"true"}},[t._v("#")]),t._v(" 抽象类接口区别-360")]),t._v(" "),a("p",[t._v("定义:\n抽象类使用 abstract class 关键字定义。\n接口使用 interface 关键字定义。")]),t._v(" "),a("p",[t._v("相同点:\n都可以有方法实现(Java1.8之前接口不能有方法实现)\n子类不需要实现全部的方法(Java1.8之前接口的子类需要实现全部的方法)")]),t._v(" "),a("p",[t._v("不同点:")]),t._v(" "),a("ol",[a("li",[a("p",[t._v("默认的方法实现\n抽象类可以有默认的方法实现,这和普通类的方法实现没有区别。Java1.8以后接口可以使用default关键字实现默认方法而不要求其子类进行实现。")])]),t._v(" "),a("li",[a("p",[t._v("实现\n子类使用extends关键字来继承抽象类。如果子类不是抽象类的话,它需要提供抽象类中所有声明的方法的实现。\t\n子类使用implements关键字来实现接口。它需要提供接口中所有声明的方法的实现,Java1.8以后子类可以不实现接口中使用default关键字定义的默认方法。")])]),t._v(" "),a("li",[a("p",[t._v("构造器\t\n抽象类可以有构造器\t\n接口不能有构造器。")])]),t._v(" "),a("li",[a("p",[t._v("与正常Java类的区别\t\n除了你不能实例化抽象类之外,它和普通Java类没有任何区别。\n接口是完全不同的类型。")])]),t._v(" "),a("li",[a("p",[t._v("访问修饰符\t\n抽象方法可以有public、protected和default这些修饰符。\n接口方法默认修饰符是public。你不可以使用其它修饰符。")])]),t._v(" "),a("li",[a("p",[t._v("main方法\t\n抽象方法可以有main方法并且我们可以运行它\t\n接口没有main方法,因此我们不能运行它。")])]),t._v(" "),a("li",[a("p",[t._v("多继承\t\n抽象类在java语言中所表示的是一种继承关系,一个子类只能存在一个父类,但是可以存在多个接口。")])]),t._v(" "),a("li",[a("p",[t._v("速度\t\n抽象类比接口速度要快。\n接口是稍微有点慢的,因为它需要时间去寻找在类中实现的方法。")])]),t._v(" "),a("li",[a("p",[t._v("添加新方法\t\n如果你往抽象类中添加新的方法,你可以给它提供默认的实现。因此你不需要改变你现在的代码。\t\n如果你往接口中添加方法,那么你必须改变实现该接口的类。Java1.8以后接口可以添加default修饰的默认方法。")])]),t._v(" "),a("li",[a("p",[t._v("成员变量\n接口中定义的变量默认是public static final 型,且必须给其初值,所以实现类中不能改变其值。\n抽象类中的变量默认是 friendly 型,其值可以在子类中重新定义,也可以重新赋值。")])])])])}],!1,null,null,null);v.options.__file="抽象类和接口-360.md";n.default=v.exports}}]);

================================================
FILE: .vuepress/dist/assets/js/59.76323003.js
================================================
(window.webpackJsonp=window.webpackJsonp||[]).push([[59],{224:function(t,s,e){"use strict";e.r(s);var n=e(0),i=Object(n.a)({},function(){this.$createElement;this._self._c;return this._m(0)},[function(){var t=this.$createElement,s=this._self._c||t;return s("div",{staticClass:"content"},[s("h4",{attrs:{id:"抽象类的意义"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#抽象类的意义","aria-hidden":"true"}},[this._v("#")]),this._v(" 抽象类的意义")]),this._v(" "),s("p",[this._v("为其子类提供一个公共的类型\n封装子类中得重复内容\n定义抽象方法,子类虽然有不同的实现 但是定义是一致的")])])}],!1,null,null,null);i.options.__file="抽象类的意义-乐视.md";s.default=i.exports}}]);

================================================
FILE: .vuepress/dist/assets/js/6.2e2bf07a.js
================================================
(window.webpackJsonp=window.webpackJsonp||[]).push([[6],{171:function(a,e,t){"use strict";t.r(e);var s=t(0),n=Object(s.a)({},function(){var a=this.$createElement,e=this._self._c||a;return e("div",{staticClass:"content"},[this._m(0),this._v(" "),e("p",[e("a",{attrs:{href:"http://blog.csdn.net/tiantiandjava/article/details/46988461",target:"_blank",rel:"noopener noreferrer"}},[this._v("Java中==和equals的区别,equals和hashCode的区别"),e("OutboundLink")],1)]),this._v(" "),e("p",[e("a",{attrs:{href:"https://www.cnblogs.com/Qian123/p/5703507.html",target:"_blank",rel:"noopener noreferrer"}},[this._v("Java提高篇——equals()与hashCode()方法详解"),e("OutboundLink")],1)])])},[function(){var a=this.$createElement,e=this._self._c||a;return e("h4",{attrs:{id:"java中-和equals和hashcode的区别-乐视"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#java中-和equals和hashcode的区别-乐视","aria-hidden":"true"}},[this._v("#")]),this._v(" java中==和equals和hashCode的区别-乐视")])}],!1,null,null,null);n.options.__file="==和equals和hashCode的区别-乐视.md";e.default=n.exports}}]);

================================================
FILE: .vuepress/dist/assets/js/60.1fff84d3.js
================================================
(window.webpackJsonp=window.webpackJsonp||[]).push([[60],{225:function(t,s,e){"use strict";e.r(s);var i=e(0),n=Object(i.a)({},function(){this.$createElement;this._self._c;return this._m(0)},[function(){var t=this.$createElement,s=this._self._c||t;return s("div",{staticClass:"content"},[s("h4",{attrs:{id:"接口的意义"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#接口的意义","aria-hidden":"true"}},[this._v("#")]),this._v(" 接口的意义")]),this._v(" "),s("p",[this._v("规范、扩展、回调")])])}],!1,null,null,null);n.options.__file="接口的意义-百度.md";s.default=n.exports}}]);

================================================
FILE: .vuepress/dist/assets/js/61.d86a49ac.js
================================================
(window.webpackJsonp=window.webpackJsonp||[]).push([[61],{165:function(t,s,e){t.exports=e.p+"assets/img/http.991db0e9.png"},226:function(t,s,e){"use strict";e.r(s);var i=[function(){var t=this.$createElement,s=this._self._c||t;return s("div",{staticClass:"content"},[s("h4",{attrs:{id:"描述一次网络请求的流程-新浪"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#描述一次网络请求的流程-新浪","aria-hidden":"true"}},[this._v("#")]),this._v(" 描述一次网络请求的流程-新浪")]),this._v(" "),s("p",[s("img",{attrs:{src:e(165),alt:""}})])])}],n=e(0),a=Object(n.a)({},function(){this.$createElement;this._self._c;return this._m(0)},i,!1,null,null,null);a.options.__file="描述一次网络请求的流程-新浪.md";s.default=a.exports}}]);

================================================
FILE: .vuepress/dist/assets/js/62.7b2b2166.js
================================================
(window.webpackJsonp=window.webpackJsonp||[]).push([[62],{227:function(t,e,r){"use strict";r.r(e);var n=r(0),i=Object(n.a)({},function(){var t=this,e=t.$createElement,r=t._self._c||e;return r("div",{staticClass:"content"},[t._m(0),t._v(" "),r("ul",[r("li",[r("a",{attrs:{href:"http://www.liuguangli.win/archives/366",target:"_blank",rel:"noopener noreferrer"}},[t._v("插件化研究之DEXCLASSLOADER"),r("OutboundLink")],1)]),t._v(" "),r("li",[r("a",{attrs:{href:"http://www.liuguangli.win/archives/387",target:"_blank",rel:"noopener noreferrer"}},[t._v("插件化研究代ACTIVITY注册"),r("OutboundLink")],1)]),t._v(" "),r("li",[r("a",{attrs:{href:"http://www.liuguangli.win/archives/452",target:"_blank",rel:"noopener noreferrer"}},[t._v("插件化研究之资源冲突"),r("OutboundLink")],1)]),t._v(" "),r("li",[r("a",{attrs:{href:"https://github.com/didi/VirtualAPK/wiki/%E7%AC%AC%E4%B8%89%E6%96%B9%E6%8A%80%E6%9C%AF%E6%96%87%E7%AB%A0",target:"_blank",rel:"noopener noreferrer"}},[t._v("VirtualAPK 解析"),r("OutboundLink")],1)])])])},[function(){var t=this.$createElement,e=this._self._c||t;return e("h3",{attrs:{id:"插件化"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#插件化","aria-hidden":"true"}},[this._v("#")]),this._v(" 插件化")])}],!1,null,null,null);i.options.__file="插件化.md";e.default=i.exports}}]);

================================================
FILE: .vuepress/dist/assets/js/63.3de4be6c.js
================================================
(window.webpackJsonp=window.webpackJsonp||[]).push([[63],{228:function(e,t,r){"use strict";r.r(t);var n=r(0),a=Object(n.a)({},function(){var e=this,t=e.$createElement,r=e._self._c||t;return r("div",{staticClass:"content"},[e._m(0),e._v(" "),e._m(1),e._v(" "),r("ul",[r("li",[r("p",[r("a",{attrs:{href:"http://www.trinea.cn/android/database-performance/",target:"_blank",rel:"noopener noreferrer"}},[e._v("性能优化之数据库优化"),r("OutboundLink")],1)])]),e._v(" "),e._m(2)]),e._v(" "),r("p",[r("a",{attrs:{href:"http://greenrobot.org/android/android-orm-performance-in-2015/",target:"_blank",rel:"noopener noreferrer"}},[e._v("ORM数据库对比"),r("OutboundLink")],1)]),e._v(" "),r("p",[r("a",{attrs:{href:"http://blog.csdn.net/u010687392/article/details/48465315",target:"_blank",rel:"noopener noreferrer"}},[e._v("GreenDao源码解析"),r("OutboundLink")],1)])])},[function(){var e=this.$createElement,t=this._self._c||e;return t("h4",{attrs:{id:"数据库"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#数据库","aria-hidden":"true"}},[this._v("#")]),this._v(" 数据库")])},function(){var e=this.$createElement,t=this._self._c||e;return t("p",[t("strong",[this._v("性能优化")])])},function(){var e=this.$createElement,t=this._self._c||e;return t("li",[t("p",[t("a",{attrs:{href:"http://lcodecorex.github.io/2016/08/12/Android%20SQLite%E6%93%8D%E4%BD%9C%E6%80%A7%E8%83%BD%E4%BC%98%E5%8C%96%E5%8A%9E%E6%B3%95(%E5%8F%82%E8%80%83GreenDao)",target:"_blank"}},[this._v("Android SQLite操作性能优化办法-参考GreenDao")])])])}],!1,null,null,null);a.options.__file="数据库.md";t.default=a.exports}}]);

================================================
FILE: .vuepress/dist/assets/js/64.f177712d.js
================================================
(window.webpackJsonp=window.webpackJsonp||[]).push([[64],{229:function(t,s,e){"use strict";e.r(s);var n=e(0),i=Object(n.a)({},function(){this.$createElement;this._self._c;return this._m(0)},[function(){var t=this.$createElement,s=this._self._c||t;return s("div",{staticClass:"content"},[s("h4",{attrs:{id:"本地广播和全局广播有什么差别"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#本地广播和全局广播有什么差别","aria-hidden":"true"}},[this._v("#")]),this._v(" 本地广播和全局广播有什么差别")]),this._v(" "),s("p",[this._v("因广播数据在本应用范围内传播,不用担心隐私数据泄露的问题。\n不用担心别的应用伪造广播,造成安全隐患。\n相比在系统内发送全局广播,它更高效。")])])}],!1,null,null,null);i.options.__file="本地广播和全局广播有什么差别.md";s.default=i.exports}}]);

================================================
FILE: .vuepress/dist/assets/js/65.a6025451.js
================================================
(window.webpackJsonp=window.webpackJsonp||[]).push([[65],{230:function(t,e,r){"use strict";r.r(e);var n=r(0),s=Object(n.a)({},function(){var t=this.$createElement,e=this._self._c||t;return e("div",{staticClass:"content"},[this._m(0),this._v(" "),e("p",[e("a",{attrs:{href:"http://tech.meituan.com/android_mvvm.html",target:"_blank",rel:"noopener noreferrer"}},[this._v("MVVM"),e("OutboundLink")],1)]),this._v(" "),e("p",[e("a",{attrs:{href:"https://code.tutsplus.com/series/how-to-adopt-model-view-presenter-on-android--cms-1012",target:"_blank",rel:"noopener noreferrer"}},[this._v("MVP"),e("OutboundLink")],1)])])},[function(){var t=this.$createElement,e=this._self._c||t;return e("h3",{attrs:{id:"架构分析"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#架构分析","aria-hidden":"true"}},[this._v("#")]),this._v(" 架构分析")])}],!1,null,null,null);s.options.__file="架构分析.md";e.default=s.exports}}]);

================================================
FILE: .vuepress/dist/assets/js/66.61b436f9.js
================================================
(window.webpackJsonp=window.webpackJsonp||[]).push([[66],{166:function(t,e,r){t.exports=r.p+"assets/img/architucture.956c4b46.png"},231:function(t,e,r){"use strict";r.r(e);var n=[function(){var t=this.$createElement,e=this._self._c||t;return e("h4",{attrs:{id:"架构设计-搜狐"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#架构设计-搜狐","aria-hidden":"true"}},[this._v("#")]),this._v(" 架构设计-搜狐")])},function(){var t=this.$createElement,e=this._self._c||t;return e("p",[e("img",{attrs:{src:r(166),alt:""}})])}],i=r(0),s=Object(i.a)({},function(){var t=this.$createElement,e=this._self._c||t;return e("div",{staticClass:"content"},[this._m(0),this._v(" "),this._m(1),this._v(" "),e("p",[e("a",{attrs:{href:"http://www.tianmaying.com/tutorial/AndroidMVC",target:"_blank",rel:"noopener noreferrer"}},[this._v("Android App的设计架构:MVC,MVP,MVVM与架构经验谈"),e("OutboundLink")],1)])])},n,!1,null,null,null);s.options.__file="架构设计-搜狐.md";e.default=s.exports}}]);

================================================
FILE: .vuepress/dist/assets/js/67.88898059.js
================================================
(window.webpackJsonp=window.webpackJsonp||[]).push([[67],{232:function(e,t,s){"use strict";s.r(t);var r=s(0),n=Object(r.a)({},function(){var e=this.$createElement,t=this._self._c||e;return t("div",{staticClass:"content"},[this._m(0),this._v(" "),t("p",[t("a",{attrs:{href:"https://itimetraveler.github.io/2016/12/27/%E3%80%90Java%E3%80%91%E6%B3%9B%E5%9E%8B%E4%B8%AD%20extends%20%E5%92%8C%20super%20%E7%9A%84%E5%8C%BA%E5%88%AB%EF%BC%9F/",target:"_blank",rel:"noopener noreferrer"}},[this._v("泛型中 extends 和 super 的区别?"),t("OutboundLink")],1)])])},[function(){var e=this.$createElement,t=this._self._c||e;return t("h4",{attrs:{id:"泛型中-extends-和-super-的区别-美团"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#泛型中-extends-和-super-的区别-美团","aria-hidden":"true"}},[this._v("#")]),this._v(" 泛型中 extends 和 super 的区别-美团")])}],!1,null,null,null);n.options.__file="泛型中extends和super的区别.md";t.default=n.exports}}]);

================================================
FILE: .vuepress/dist/assets/js/68.52455085.js
================================================
(window.webpackJsonp=window.webpackJsonp||[]).push([[68],{233:function(e,t,r){"use strict";r.r(t);var n=r(0),i=Object(n.a)({},function(){var e=this,t=e.$createElement,r=e._self._c||t;return r("div",{staticClass:"content"},[e._m(0),e._v(" "),r("p",[e._v("现在Android技术发展到了中后期,针对技术的考核不再纠结于知识点,或者说技术人员之间在知识点上已经无太大区别,这个时候面试更加倾向于知识深入的能力、技术思维等,比如面试中面试官经常会说,你有没有研究的一些深入的点,如果没有准备经常会一脸懵逼,也不知道这个代表什么意思。")]),e._v(" "),r("p",[e._v("我们获取知识,基本有两种,一种是主动根据知识图谱学习,还有就是根据经历的业务,这两种方式能使某一个点的深入研究达到业界水平,基本上也是由于业务本身的需要,像一些阿里的高P,基本都是跟着淘宝的黄金十年成长起来的。大部分人都是没机会接触到这样的业务,但并不代表能力不行。下面我会举几个值得深入研究的点,供大家参考。")]),e._v(" "),e._m(1),e._v(" "),r("p",[e._v("直播间聊天框或者大量图文混排业务,使用原生TextView会出现性能问题,相关研究方案如下:")]),e._v(" "),r("ul",[r("li",[r("a",{attrs:{href:"https://www.jianshu.com/p/9f7f9213bff8",target:"_blank",rel:"noopener noreferrer"}},[e._v("TextView性能瓶颈,渲染优化,以及StaticLayout的一些用处"),r("OutboundLink")],1)]),e._v(" "),r("li",[r("a",{attrs:{href:"http://codethink.me/2015/04/23/improving-comment-rendering-on-android/",target:"_blank",rel:"noopener noreferrer"}},[e._v("[译]Instagram是如何提升TextView渲染性能的"),r("OutboundLink")],1)]),e._v(" "),r("li",[r("a",{attrs:{href:"http://ragnraok.github.io/textview-pre-render-research.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("TextView预渲染研究"),r("OutboundLink")],1)])]),e._v(" "),e._m(2),e._v(" "),r("p",[e._v("日志相关的可以参考微信的研究,这里面有很多可以具体深入的点:mmap、压缩算法等,甚至可以扩展到Linux系统是如何做存储的,相关的一整套方案")]),e._v(" "),r("ul",[r("li",[r("a",{attrs:{href:"https://mp.weixin.qq.com/s/cnhuEodJGIbdodh0IxNeXQ",target:"_blank",rel:"noopener noreferrer"}},[e._v("微信终端跨平台组件 mars 系列(一) - 高性能日志模块xlog"),r("OutboundLink")],1)]),e._v(" "),r("li",[r("a",{attrs:{href:"https://download.csdn.net/download/wanruoqingkong/9510593",target:"_blank",rel:"noopener noreferrer"}},[e._v("存储技术原理分析_基于Linux 2.6内核源代码"),r("OutboundLink")],1)])]),e._v(" "),e._m(3),e._v(" "),r("p",[e._v("深入阅读过一些大型开源项目的源码,也是一种可深入的能力体现")]),e._v(" "),r("ul",[r("li",[r("a",{attrs:{href:"http://www.jackywang.tech/2018/05/22/IntelliJ%20IDE%20%E6%90%9C%E7%B4%A2%E5%BC%95%E7%94%A8%E5%A6%82%E4%BD%95%E5%AE%9E%E7%8E%B0%EF%BC%9F/",target:"_blank",rel:"noopener noreferrer"}},[e._v("IntelliJ IDEA 引用搜索原理"),r("OutboundLink")],1)]),e._v(" "),r("li",[r("a",{attrs:{href:"https://github.com/BeesAndroid/BeesAndroid",target:"_blank",rel:"noopener noreferrer"}},[e._v("Android 源码分析项目"),r("OutboundLink")],1)])]),e._v(" "),e._m(4),e._v(" "),r("p",[e._v("内存优化也可以作为一个专项研究,像内存分类、线程消耗等等")]),e._v(" "),r("ul",[r("li",[r("a",{attrs:{href:"https://mp.weixin.qq.com/s?__biz=MzA3NjA3NTI5Mg==&mid=2656330117&idx=1&sn=a304224af107ab97a6dfc8e04e153bef&chksm=84c619f6b3b190e08796ba9448d8e23e92b9977e1c12845457b27b3cb6e824d455ab7759e400&scene=21#wechat_redirect",target:"_blank",rel:"noopener noreferrer"}},[e._v("我这样减少了26.5M Java内存!"),r("OutboundLink")],1)])]),e._v(" "),e._m(5),e._v(" "),r("ul",[r("li",[r("a",{attrs:{href:"https://mp.weixin.qq.com/s/CUU3Ml394H_fkabhNNX32Q",target:"_blank",rel:"noopener noreferrer"}},[e._v("Android GC 原理探究"),r("OutboundLink")],1)])]),e._v(" "),e._m(6),e._v(" "),r("p",[e._v("如果项目中大量使用到so库的话,可能会经常碰到这个error,可以从这个点下去研究so库是如何加载,以及如何解决这个问题")]),e._v(" "),r("ul",[r("li",[r("a",{attrs:{href:"https://mp.weixin.qq.com/s/wvt3NABA-NnQxpbcxhAGiA",target:"_blank",rel:"noopener noreferrer"}},[e._v("Android 动态链接库加载原理及 HotFix 方案介绍"),r("OutboundLink")],1)])]),e._v(" "),e._m(7),e._v(" "),r("p",[e._v("性能优化:")]),e._v(" "),r("p",[r("a",{attrs:{href:"https://tech.meituan.com/WebViewPerf.html?utm_source=tool.lu",target:"_blank",rel:"noopener noreferrer"}},[e._v("WebView性能、体验分析与优化"),r("OutboundLink")],1)]),e._v(" "),e._m(8),e._v(" "),r("p",[r("a",{attrs:{href:"https://mp.weixin.qq.com/s/evzDnTsHrAr2b9jcevwBzA",target:"_blank",rel:"noopener noreferrer"}},[e._v("70%以上业务由H5开发,手机QQ Hybrid 的架构如何优化演进?\n"),r("OutboundLink")],1)]),e._v(" "),r("p",[e._v("安全:")]),e._v(" "),r("ul",[r("li",[r("a",{attrs:{href:"https://zhuanlan.zhihu.com/p/21787366",target:"_blank",rel:"noopener noreferrer"}},[e._v("【腾讯御安全】Android安全开发之WebView中的地雷"),r("OutboundLink")],1)])]),e._v(" "),r("p",[e._v("简析Chrome和Webkit的渊源")]),e._v(" "),r("ul",[r("li",[r("a",{attrs:{href:"https://www.cnblogs.com/zichi/p/5116764.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("内核历史"),r("OutboundLink")],1)]),e._v(" "),r("li",[r("a",{attrs:{href:"https://www.jianshu.com/p/332c15fd7c7d",target:"_blank",rel:"noopener noreferrer"}},[e._v("浅读V8——强大的JavaScript引擎"),r("OutboundLink")],1)])]),e._v(" "),r("p",[r("a",{attrs:{href:"https://blog.csdn.net/luoshengyang/article/details/46569161",target:"_blank",rel:"noopener noreferrer"}},[e._v("Android Chromium WebView学习启动篇"),r("OutboundLink")],1)]),e._v(" "),r("p",[e._v("Webview 渲染机制")]),e._v(" "),r("ul",[r("li",[r("a",{attrs:{href:"https://blog.csdn.net/luoshengyang/article/details/50916769",target:"_blank",rel:"noopener noreferrer"}},[e._v("Chromium网页渲染机制简要介绍和学习计划"),r("OutboundLink")],1)]),e._v(" "),r("li",[r("a",{attrs:{href:"https://blog.csdn.net/Luoshengyang/article/details/53366272",target:"_blank",rel:"noopener noreferrer"}},[e._v("Android WebView硬件加速渲染网页UI的过程分析"),r("OutboundLink")],1)])]),e._v(" "),r("p",[e._v("视频")]),e._v(" "),r("ul",[r("li",[r("a",{attrs:{href:"https://blog.csdn.net/luoshengyang/article/details/52009477",target:"_blank",rel:"noopener noreferrer"}},[e._v("Chromium视频标签 video 简要介绍和学习计划"),r("OutboundLink")],1)])]),e._v(" "),r("p",[e._v("多进程")]),e._v(" "),r("ul",[r("li",[r("a",{attrs:{href:"https://blog.csdn.net/luoshengyang/article/details/47364477",target:"_blank",rel:"noopener noreferrer"}},[e._v("Chromium多进程架构简要介绍和学习计划"),r("OutboundLink")],1)])])])},[function(){var e=this.$createElement,t=this._self._c||e;return t("h3",{attrs:{id:"深入研究的知识点"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#深入研究的知识点","aria-hidden":"true"}},[this._v("#")]),this._v(" 深入研究的知识点")])},function(){var e=this.$createElement,t=this._self._c||e;return t("p",[t("strong",[this._v("TextView性能问题")])])},function(){var e=this.$createElement,t=this._self._c||e;return t("p",[t("strong",[this._v("日志性能")])])},function(){var e=this.$createElement,t=this._self._c||e;return t("p",[t("strong",[this._v("研究过大型开源项目源码")])])},function(){var e=this.$createElement,t=this._self._c||e;return t("p",[t("strong",[this._v("内存优化")])])},function(){var e=this.$createElement,t=this._self._c||e;return t("p",[t("strong",[this._v("垃圾回收")])])},function(){var e=this.$createElement,t=this._self._c||e;return t("p",[t("strong",[this._v("java.lang.UnsatisfiedLinkError")])])},function(){var e=this.$createElement,t=this._self._c||e;return t("p",[t("strong",[this._v("浏览器相关")])])},function(){var e=this.$createElement,t=this._self._c||e;return t("ol",[t("li",[this._v("全局的webview,预加载")]),this._v(" "),t("li",[this._v("初始化、加载数据并行")]),this._v(" "),t("li",[this._v("DNS采用和客户端API相同的域名")])])}],!1,null,null,null);i.options.__file="深入研究的知识点.md";t.default=i.exports}}]);

================================================
FILE: .vuepress/dist/assets/js/69.d4a08d30.js
================================================
(window.webpackJsonp=window.webpackJsonp||[]).push([[69],{234:function(t,s,e){"use strict";e.r(s);var i=e(0),n=Object(i.a)({},function(){this.$createElement;this._self._c;return this._m(0)},[function(){var t=this.$createElement,s=this._self._c||t;return s("div",{staticClass:"content"},[s("h4",{attrs:{id:"父类的静态方法能否被子类重写-猎豹"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#父类的静态方法能否被子类重写-猎豹","aria-hidden":"true"}},[this._v("#")]),this._v(" 父类的静态方法能否被子类重写-猎豹")]),this._v(" "),s("p",[this._v("不能")]),this._v(" "),s("p",[this._v("子类继承父类后,用相同的静态方法和非静态方法,这时非静态方法覆盖父类中的方法(即方法重写),父类的该静态方法被隐藏(如果对象是父类则调用该隐藏的方法),另外子类可继承父类的静态与非静态方法,至于方法重载我觉得它其中一要素就是在同一类中,不能说父类中的什么方法与子类里的什么方法是方法重载的体现")])])}],!1,null,null,null);n.options.__file="父类的静态方法能否被子类重写-猎豹.md";s.default=n.exports}}]);

================================================
FILE: .vuepress/dist/assets/js/7.e7997178.js
================================================
(window.webpackJsonp=window.webpackJsonp||[]).push([[7],{172:function(e,t,r){"use strict";r.r(t);var a=r(0),i=Object(a.a)({},function(){this.$createElement;this._self._c;return this._m(0)},[function(){var e=this,t=e.$createElement,r=e._self._c||t;return r("div",{staticClass:"content"},[r("h4",{attrs:{id:"anr定位和修正"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#anr定位和修正","aria-hidden":"true"}},[e._v("#")]),e._v(" ANR定位和修正")]),e._v(" "),r("p",[e._v("如果开发机器上出现问题,我们可以通过查看/data/anr/traces.txt即可,最新的ANR信息在最开始部分。")]),e._v(" "),r("ul",[r("li",[r("p",[e._v("主线程被IO操作(从4.0之后网络IO不允许在主线程中)阻塞。")])]),e._v(" "),r("li",[r("p",[e._v("主线程中存在耗时的计算")])]),e._v(" "),r("li",[r("p",[e._v("主线程中错误的操作,比如Thread.wait或者Thread.sleep等\nAndroid系统会监控程序的响应状况,一旦出现下面两种情况,则弹出ANR对话框")])]),e._v(" "),r("li",[r("p",[e._v("应用在5秒内未响应用户的输入事件(如按键或者触摸)")])]),e._v(" "),r("li",[r("p",[e._v("BroadcastReceiver未在10秒内完成相关的处理")])]),e._v(" "),r("li",[r("p",[e._v("Service在特定的时间内无法处理完成 20秒")])]),e._v(" "),r("li",[r("p",[e._v("使用AsyncTask处理耗时IO操作。")])]),e._v(" "),r("li",[r("p",[e._v("使用Thread或者HandlerThread时,调用Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND)设置优先级,否则仍然会降低程序响应,因为默认Thread的优先级和主线程相同。")])]),e._v(" "),r("li",[r("p",[e._v("使用Handler处理工作线程结果,而不是使用Thread.wait()或者Thread.sleep()来阻塞主线程。")])]),e._v(" "),r("li",[r("p",[e._v("Activity的onCreate和onResume回调中尽量避免耗时的代码")])]),e._v(" "),r("li",[r("p",[e._v("BroadcastReceiver中onReceive代码也要尽量减少耗时,建议使用IntentService处理。")])])])])}],!1,null,null,null);i.options.__file="ANR定位和修正.md";t.default=i.exports}}]);

================================================
FILE: .vuepress/dist/assets/js/70.52acb40b.js
================================================
(window.webpackJsonp=window.webpackJsonp||[]).push([[70],{235:function(t,a,e){"use strict";e.r(a);var i=e(0),r=Object(i.a)({},function(){this.$createElement;this._self._c;return this._m(0)},[function(){var t=this,a=t.$createElement,e=t._self._c||a;return e("div",{staticClass:"content"},[e("h3",{attrs:{id:"百度"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#百度","aria-hidden":"true"}},[t._v("#")]),t._v(" 百度")]),t._v(" "),e("h4",{attrs:{id:"笔试题"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#笔试题","aria-hidden":"true"}},[t._v("#")]),t._v(" 笔试题")]),t._v(" "),e("ol",[e("li",[t._v("冒泡排序")]),t._v(" "),e("li",[t._v("四大组件的生命周期和简单用法")]),t._v(" "),e("li",[t._v("图片框架缓存实现")]),t._v(" "),e("li",[t._v("设计网络请求框架")])]),t._v(" "),e("h4",{attrs:{id:"问答"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#问答","aria-hidden":"true"}},[t._v("#")]),t._v(" 问答")]),t._v(" "),e("ol",[e("li",[t._v("LruCache默认缓存大小")]),t._v(" "),e("li",[t._v("httpurlconnection 和 okhttp关系(HTTPurlconnection 底层基于OKHTTP)")]),t._v(" "),e("li",[t._v("开源库源码分析")]),t._v(" "),e("li",[t._v("从0设计一款App整体架构(可以结合微信和淘宝架构演进方面进行回答)")])])])}],!1,null,null,null);r.options.__file="百度.md";a.default=r.exports}}]);

================================================
FILE: .vuepress/dist/assets/js/71.27515e96.js
================================================
(window.webpackJsonp=window.webpackJsonp||[]).push([[71],{236:function(e,t,r){"use strict";r.r(t);var n=r(0),o=Object(n.a)({},function(){var e=this,t=e.$createElement,r=e._self._c||t;return r("div",{staticClass:"content"},[e._m(0),e._v(" "),r("blockquote",[r("p",[e._v("算法是其次,主要是写码能力与熟练度。\n作者:文航\n"),r("a",{attrs:{href:"https://www.zhihu.com/question/24964987/answer/33541018",target:"_blank",rel:"noopener noreferrer"}},[e._v("链接"),r("OutboundLink")],1),e._v("\n来源:知乎")])]),e._v(" "),r("p",[e._v("算法虽然在平常工作中接触的可能不多,但是面试还会可能遇到,尤其是一些知名外企如微软、Facebook、Google,因为面试的人都很优秀,所以算法基础、专业技术能力、衍生技术能力都需要,但也并不是绝对。")]),e._v(" "),r("p",[e._v("以下内容基本来自于LeetCode,英文较好的可以直接去官网刷题。")]),e._v(" "),r("ul",[r("li",[r("a",{attrs:{href:"http://eddy.wiki/interview-code.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("Android 面试之编程算法题"),r("OutboundLink")],1)]),e._v(" "),r("li",[r("a",{attrs:{href:"http://www.programcreek.com/2012/12/%E9%9D%A2%E8%AF%9510%E5%A4%A7%E7%AE%97%E6%B3%95%E6%B1%87%E6%80%BB%EF%BC%8B%E5%B8%B8%E8%A7%81%E9%A2%98%E7%9B%AE%E8%A7%A3%E7%AD%94/",target:"_blank",rel:"noopener noreferrer"}},[e._v("面试10大算法汇总+常见题目解答"),r("OutboundLink")],1)]),e._v(" "),r("li",[r("a",{attrs:{href:"https://algorithm.yuanbin.me/zh-hans/",target:"_blank",rel:"noopener noreferrer"}},[e._v("数据结构与算法/leetcode/lintcode题解"),r("OutboundLink")],1)]),e._v(" "),r("li",[r("a",{attrs:{href:"https://hk029.gitbooks.io/leetbook/content/",target:"_blank",rel:"noopener noreferrer"}},[e._v("LeetCode 详解"),r("OutboundLink")],1)])])])},[function(){var e=this.$createElement,t=this._self._c||e;return t("h3",{attrs:{id:"算法"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#算法","aria-hidden":"true"}},[this._v("#")]),this._v(" 算法")])}],!1,null,null,null);o.options.__file="算法.md";t.default=o.exports}}]);

================================================
FILE: .vuepress/dist/assets/js/72.0d8204b2.js
================================================
(window.webpackJsonp=window.webpackJsonp||[]).push([[72],{237:function(t,e,r){"use strict";r.r(e);var n=r(0),a=Object(n.a)({},function(){var t=this,e=t.$createElement,r=t._self._c||e;return r("div",{staticClass:"content"},[t._m(0),t._v(" "),t._m(1),t._v(" "),r("ul",[r("li",[r("a",{attrs:{href:"https://blog.csdn.net/u011240877/article/details/57202704",target:"_blank",rel:"noopener noreferrer"}},[t._v("并发编程1:全面认识 Thread"),r("OutboundLink")],1)])]),t._v(" "),t._m(2),t._v(" "),r("ul",[r("li",[r("a",{attrs:{href:"https://my.oschina.net/mingdongcheng/blog/139263",target:"_blank",rel:"noopener noreferrer"}},[t._v("一张图让你看懂JAVA线程间的状态转换"),r("OutboundLink")],1)])]),t._v(" "),t._m(3),t._v(" "),r("ul",[r("li",[r("a",{attrs:{href:"https://blog.csdn.net/u011240877/article/details/58756137",target:"_blank",rel:"noopener noreferrer"}},[t._v("并发编程2:认识并发编程的利与弊"),r("OutboundLink")],1)]),t._v(" "),r("li",[r("a",{attrs:{href:"https://blog.csdn.net/u011240877/article/details/73440993",target:"_blank",rel:"noopener noreferrer"}},[t._v("并发编程3:线程池的使用与执行流程"),r("OutboundLink")],1)]),t._v(" "),r("li",[r("a",{attrs:{href:"https://itimetraveler.github.io/2018/02/13/%E3%80%90Java%E3%80%91%E7%BA%BF%E7%A8%8B%E6%B1%A0ThreadPoolExecutor%E5%AE%9E%E7%8E%B0%E5%8E%9F%E7%90%86/",target:"_blank",rel:"noopener noreferrer"}},[t._v("线程池ThreadPoolExecutor实现原理"),r("OutboundLink")],1)])])])},[function(){var t=this.$createElement,e=this._self._c||t;return e("h4",{attrs:{id:"线程-线程池原理-腾讯"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#线程-线程池原理-腾讯","aria-hidden":"true"}},[this._v("#")]),this._v(" 线程 线程池原理-腾讯")])},function(){var t=this.$createElement,e=this._self._c||t;return e("p",[e("strong",[this._v("线程")])])},function(){var t=this.$createElement,e=this._self._c||t;return e("p",[e("strong",[this._v("线程状态:")])])},function(){var t=this.$createElement,e=this._self._c||t;return e("p",[e("strong",[this._v("线程池")])])}],!1,null,null,null);a.options.__file="线程 线程池原理-腾讯.md";e.default=a.exports}}]);

================================================
FILE: .vuepress/dist/assets/js/73.a431f4a6.js
================================================
(window.webpackJsonp=window.webpackJsonp||[]).push([[73],{238:function(t,n,s){"use strict";s.r(n);var a=s(0),e=Object(a.a)({},function(){var t=this,n=t.$createElement,s=t._self._c||n;return s("div",{staticClass:"content"},[t._m(0),t._v(" "),s("p",[s("a",{attrs:{href:"http://www.itzhai.com/java-based-notebook-thread-synchronization-problem-solving-synchronization-problems-synchronized-block-synchronized-methods.html#read-more",target:"_blank",rel:"noopener noreferrer"}},[t._v("线程同步问题"),s("OutboundLink")],1)]),t._v(" "),s("p",[s("a",{attrs:{href:"http://www.juwends.com/tech/android/android-inter-thread-comm.html",target:"_blank",rel:"noopener noreferrer"}},[t._v("Android线程间交互(Java synchronized & Android Handler)"),s("OutboundLink")],1)]),t._v(" "),s("p",[t._v("单例")]),t._v(" "),t._m(1)])},[function(){var t=this.$createElement,n=this._self._c||t;return n("h4",{attrs:{id:"线程同步-百度"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#线程同步-百度","aria-hidden":"true"}},[this._v("#")]),this._v(" 线程同步-百度")])},function(){var t=this,n=t.$createElement,s=t._self._c||n;return s("div",{staticClass:"language-java extra-class"},[s("pre",{pre:!0,attrs:{class:"language-java"}},[s("code",[s("span",{attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),s("span",{attrs:{class:"token keyword"}},[t._v("class")]),t._v(" "),s("span",{attrs:{class:"token class-name"}},[t._v("Singleton")]),s("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n"),s("span",{attrs:{class:"token keyword"}},[t._v("private")]),t._v(" "),s("span",{attrs:{class:"token keyword"}},[t._v("volatile")]),t._v(" "),s("span",{attrs:{class:"token keyword"}},[t._v("static")]),t._v(" Singleton mSingleton"),s("span",{attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{attrs:{class:"token keyword"}},[t._v("private")]),t._v(" "),s("span",{attrs:{class:"token function"}},[t._v("Singleton")]),s("span",{attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n"),s("span",{attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),s("span",{attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),s("span",{attrs:{class:"token keyword"}},[t._v("static")]),t._v(" Singleton "),s("span",{attrs:{class:"token function"}},[t._v("getInstance")]),s("span",{attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n  "),s("span",{attrs:{class:"token keyword"}},[t._v("if")]),s("span",{attrs:{class:"token punctuation"}},[t._v("(")]),t._v("mSingleton "),s("span",{attrs:{class:"token operator"}},[t._v("==")]),t._v(" null"),s("span",{attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\\\\A\n    "),s("span",{attrs:{class:"token keyword"}},[t._v("synchronized")]),s("span",{attrs:{class:"token punctuation"}},[t._v("(")]),t._v("Singleton"),s("span",{attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{attrs:{class:"token keyword"}},[t._v("class")]),s("span",{attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\\\\C\n     "),s("span",{attrs:{class:"token keyword"}},[t._v("if")]),s("span",{attrs:{class:"token punctuation"}},[t._v("(")]),t._v("mSingleton "),s("span",{attrs:{class:"token operator"}},[t._v("==")]),t._v(" null"),s("span",{attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n      mSingleton "),s("span",{attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{attrs:{class:"token keyword"}},[t._v("new")]),t._v(" "),s("span",{attrs:{class:"token class-name"}},[t._v("Singleton")]),s("span",{attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\\\\B\n      "),s("span",{attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n    "),s("span",{attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n    "),s("span",{attrs:{class:"token keyword"}},[t._v("return")]),t._v(" mSingleton"),s("span",{attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n  "),s("span",{attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),s("span",{attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])])}],!1,null,null,null);e.options.__file="线程同步-百度.md";n.default=e.exports}}]);

================================================
FILE: .vuepress/dist/assets/js/74.e30eb438.js
================================================
(window.webpackJsonp=window.webpackJsonp||[]).push([[74],{239:function(e,t,r){"use strict";r.r(t);var n=r(0),o=Object(n.a)({},function(){var e=this,t=e.$createElement,r=e._self._c||t;return r("div",{staticClass:"content"},[e._m(0),e._v(" "),r("p",[e._v("目前大多数应用中都会使用一些开源网络库,对于此我们不仅要知道是什么,而且也要知道为什么。")]),e._v(" "),e._m(1),e._v(" "),r("ul",[r("li",[r("a",{attrs:{href:"https://www.jianshu.com/p/6e9e4156ece3",target:"_blank",rel:"noopener noreferrer"}},[e._v("一篇文章带你详解 HTTP 协议(网络协议篇一)"),r("OutboundLink")],1)]),e._v(" "),r("li",[r("a",{attrs:{href:"https://www.jianshu.com/p/9f3e879a4c9c",target:"_blank",rel:"noopener noreferrer"}},[e._v("一篇文章带你熟悉 TCP/IP 协议(网络协议篇二)"),r("OutboundLink")],1)]),e._v(" "),r("li",[r("a",{attrs:{href:"https://zhuanlan.zhihu.com/p/27395037",target:"_blank",rel:"noopener noreferrer"}},[e._v("HTTPS系列干货(一):HTTPS 原理详解"),r("OutboundLink")],1)]),e._v(" "),r("li",[r("a",{attrs:{href:"https://cloud.tencent.com/developer/article/1071325",target:"_blank",rel:"noopener noreferrer"}},[e._v("TCP、UDP、IP 协议分析"),r("OutboundLink")],1)]),e._v(" "),r("li",[r("a",{attrs:{href:"https://juejin.im/post/598ba1d06fb9a03c4d6464ab#heading-28",target:"_blank",rel:"noopener noreferrer"}},[e._v("关于 TCP/IP,必知必会的十个问题"),r("OutboundLink")],1)]),e._v(" "),r("li",[r("a",{attrs:{href:"https://www.ibm.com/developerworks/cn/linux/l-linux-networking-stack/index.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("Linux 网络栈剖析"),r("OutboundLink")],1)])]),e._v(" "),e._m(2),e._v(" "),r("ul",[r("li",[r("a",{attrs:{href:"https://segmentfault.com/a/1190000011350889",target:"_blank",rel:"noopener noreferrer"}},[e._v("Android网络编程之Socket"),r("OutboundLink")],1)]),e._v(" "),r("li",[r("a",{attrs:{href:"https://www.jianshu.com/p/fb4dfab4eec1",target:"_blank",rel:"noopener noreferrer"}},[e._v("Android网络编程之--Socket编程"),r("OutboundLink")],1)])]),e._v(" "),e._m(3),e._v(" "),r("ul",[r("li",[r("a",{attrs:{href:"http://stackoverflow.com/questions/16902716/comparison-of-android-networking-libraries-okhttp-retrofit-and-volley",target:"_blank",rel:"noopener noreferrer"}},[e._v("comparison-of-android-networking-libraries-okhttp-retrofit-and-volley"),r("OutboundLink")],1)]),e._v(" "),r("li",[r("a",{attrs:{href:"http://blog.csdn.net/hwz2311245/article/details/46845271",target:"_blank",rel:"noopener noreferrer"}},[e._v("Android Async HTTP Clients: Volley vs Retrofit"),r("OutboundLink")],1)]),e._v(" "),r("li",[r("a",{attrs:{href:"https://segmentfault.com/a/1190000003965158",target:"_blank",rel:"noopener noreferrer"}},[e._v("Android实战之你应该使用哪个网络库?"),r("OutboundLink")],1)])]),e._v(" "),e._m(4),e._v(" "),r("ul",[r("li",[r("a",{attrs:{href:"http://p.codekk.com/blogs/detail/54cfab086c4761e5001b2542",target:"_blank",rel:"noopener noreferrer"}},[e._v("Volley"),r("OutboundLink")],1)]),e._v(" "),r("li",[r("a",{attrs:{href:"https://www.jianshu.com/p/82f74db14a18",target:"_blank",rel:"noopener noreferrer"}},[e._v("okhttp"),r("OutboundLink")],1)]),e._v(" "),r("li",[r("a",{attrs:{href:"https://github.com/android-cn/android-open-project-analysis/tree/master/tool-lib/network/retrofit",target:"_blank",rel:"noopener noreferrer"}},[e._v("retrofit"),r("OutboundLink")],1)])])])},[function(){var e=this.$createElement,t=this._self._c||e;return t("h4",{attrs:{id:"网络"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#网络","aria-hidden":"true"}},[this._v("#")]),this._v(" 网络")])},function(){var e=this.$createElement,t=this._self._c||e;return t("p",[t("strong",[this._v("协议")])])},function(){var e=this.$createElement,t=this._self._c||e;return t("p",[t("strong",[this._v("网络编程")])])},function(){var e=this.$createElement,t=this._self._c||e;return t("p",[t("strong",[this._v("流行网络库对比")])])},function(){var e=this.$createElement,t=this._self._c||e;return t("p",[t("strong",[this._v("源码解析")])])}],!1,null,null,null);o.options.__file="网络.md";t.default=o.exports}}]);

================================================
FILE: .vuepress/dist/assets/js/75.6317c6b5.js
================================================
(window.webpackJsonp=window.webpackJsonp||[]).push([[75],{240:function(t,e,a){"use strict";a.r(e);var r=a(0),s=Object(r.a)({},function(){var t=this,e=t.$createElement,a=t._self._c||e;return a("div",{staticClass:"content"},[t._m(0),t._v(" "),t._m(1),t._v(" "),a("p",[t._v("冒泡、选择、建堆")]),t._v(" "),t._m(2),t._v(" "),a("p",[t._v("图片缓存、异常恢复、质量压缩")]),t._v(" "),t._m(3),t._v(" "),a("p",[t._v("渲染帧率、内存")]),t._v(" "),t._m(4),t._v(" "),a("p",[t._v("单例、观察者、适配器、建造者。。")]),t._v(" "),t._m(5),t._v(" "),a("p",[a("a",{attrs:{href:"http://www.infoq.com/cn/articles/java-memory-model-1",target:"_blank",rel:"noopener noreferrer"}},[t._v("深入理解 Java 内存模型(一)——基础"),a("OutboundLink")],1)]),t._v(" "),t._m(6),t._v(" "),a("p",[t._v("如果在当前线程内使用Handler postdelayed 两个消息,一个延迟5s,一个延迟10s,然后使当前线程sleep 5秒,以上消息的执行时间会如何变化?\n答:照常执行")]),t._v(" "),a("p",[t._v("扩展:sleep时间<=5 对两个消息无影响,5< sleep时间 <=10 对第一个消息有影响,第一个消息会延迟到sleep后执行,sleep时间>10 对两个时间都有影响,都会延迟到sleep后执行。")])])},[function(){var t=this.$createElement,e=this._self._c||t;return e("h3",{attrs:{id:"腾讯"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#腾讯","aria-hidden":"true"}},[this._v("#")]),this._v(" 腾讯")])},function(){var t=this.$createElement,e=this._self._c||t;return e("h4",{attrs:{id:"_2000万个整数,找出第五十大的数字?"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#_2000万个整数,找出第五十大的数字?","aria-hidden":"true"}},[this._v("#")]),this._v(" 2000万个整数,找出第五十大的数字?")])},function(){var t=this.$createElement,e=this._self._c||t;return e("h4",{attrs:{id:"从网络加载一个10m的图片,说下注意事项"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#从网络加载一个10m的图片,说下注意事项","aria-hidden":"true"}},[this._v("#")]),this._v(" 从网络加载一个10M的图片,说下注意事项")])},function(){var t=this.$createElement,e=this._self._c||t;return e("h4",{attrs:{id:"自定义view注意事项"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#自定义view注意事项","aria-hidden":"true"}},[this._v("#")]),this._v(" 自定义View注意事项")])},function(){var t=this.$createElement,e=this._self._c||t;return e("h4",{attrs:{id:"项目中常用的设计模式"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#项目中常用的设计模式","aria-hidden":"true"}},[this._v("#")]),this._v(" 项目中常用的设计模式")])},function(){var t=this.$createElement,e=this._self._c||t;return e("h4",{attrs:{id:"jvm的理解"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#jvm的理解","aria-hidden":"true"}},[this._v("#")]),this._v(" JVM的理解")])},function(){var t=this.$createElement,e=this._self._c||t;return e("h4",{attrs:{id:"线程sleep对消息的影响"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#线程sleep对消息的影响","aria-hidden":"true"}},[this._v("#")]),this._v(" 线程sleep对消息的影响")])}],!1,null,null,null);s.options.__file="腾讯.md";e.default=s.exports}}]);

================================================
FILE: .vuepress/dist/assets/js/76.ec7c8c11.js
================================================
(window.webpackJsonp=window.webpackJsonp||[]).push([[76],{241:function(t,e,r){"use strict";r.r(e);var n=r(0),a=Object(n.a)({},function(){var t=this.$createElement,e=this._self._c||t;return e("div",{staticClass:"content"},[this._m(0),this._v(" "),e("ul",[e("li",[e("a",{attrs:{href:"https://segmentfault.com/a/1190000008995781",target:"_blank",rel:"noopener noreferrer"}},[this._v("JVM类加载过程 & 双亲委派模型"),e("OutboundLink")],1)]),this._v(" "),e("li",[e("a",{attrs:{href:"http://www.jackywang.tech/2017/05/11/JVM-%E7%AD%94%E7%96%91%E8%A7%A3%E6%83%91/",target:"_blank",rel:"noopener noreferrer"}},[this._v("JVM 答疑解惑"),e("OutboundLink")],1)]),this._v(" "),e("li",[e("a",{attrs:{href:"http://www.jackywang.tech/2017/08/21/%E5%85%B3%E4%BA%8EDalvik%EF%BC%8C%E6%88%91%E4%BB%AC%E8%AF%A5%E7%9F%A5%E9%81%93%E4%BA%9B%E4%BB%80%E4%B9%88%EF%BC%9F/",target:"_blank",rel:"noopener noreferrer"}},[this._v("关于Dalvik,我们该知道些什么?"),e("OutboundLink")],1)])])])},[function(){var t=this.$createElement,e=this._self._c||t;return e("h4",{attrs:{id:"虚拟机-百度-乐视"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#虚拟机-百度-乐视","aria-hidden":"true"}},[this._v("#")]),this._v(" 虚拟机-百度-乐视")])}],!1,null,null,null);a.options.__file="虚拟机-百度-乐视.md";e.default=a.exports}}]);

================================================
FILE: .vuepress/dist/assets/js/77.50e04b3f.js
================================================
(window.webpackJsonp=window.webpackJsonp||[]).push([[77],{242:function(t,e,n){"use strict";n.r(e);var r=n(0),s=Object(r.a)({},function(){var t=this.$createElement,e=this._self._c||t;return e("div",{staticClass:"content"},[this._m(0),this._v(" "),e("p",[e("a",{attrs:{href:"http://blog.csdn.net/bboyfeiyu/article/details/44563871",target:"_blank",rel:"noopener noreferrer"}},[this._v("Android源码设计模式分析"),e("OutboundLink")],1)])])},[function(){var t=this.$createElement,e=this._self._c||t;return e("h4",{attrs:{id:"设计模式"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#设计模式","aria-hidden":"true"}},[this._v("#")]),this._v(" 设计模式")])}],!1,null,null,null);s.options.__file="设计模式.md";e.default=s.exports}}]);

================================================
FILE: .vuepress/dist/assets/js/78.759c37d0.js
================================================
(window.webpackJsonp=window.webpackJsonp||[]).push([[78],{243:function(t,_,e){"use strict";e.r(_);var v=e(0),n=Object(v.a)({},function(){this.$createElement;this._self._c;return this._m(0)},[function(){var t=this,_=t.$createElement,e=t._self._c||_;return e("div",{staticClass:"content"},[e("h4",{attrs:{id:"进程和线程的区别-猎豹-美团"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#进程和线程的区别-猎豹-美团","aria-hidden":"true"}},[t._v("#")]),t._v(" 进程和线程的区别-猎豹-美团")]),t._v(" "),e("p",[t._v("简而言之,一个程序至少有一个进程,一个进程至少有一个线程。")]),t._v(" "),e("p",[t._v("线程的划分尺度小于进程,使得多线程程序的并发性高。")]),t._v(" "),e("p",[t._v("另外,进程在执行过程中拥有独立的内存单元,而多个线程共享内存,从而极大地提高了程序的运行效率。")]),t._v(" "),e("p",[t._v("线程在执行过程中与进程还是有区别的。每个独立的线程有一个程序运行的入口、顺序执行序列和程序的出口。但是线程不能够独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制。")]),t._v(" "),e("p",[t._v("从逻辑角度来看,多线程的意义在于一个应用程序中,有多个执行部分可以同时执行。但操作系统并没有将多个线程看做多个独立的应用,来实现进程的调度和管理以及资源分配。这就是进程和线程的重要区别。")]),t._v(" "),e("p",[t._v("进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位.")]),t._v(" "),e("p",[t._v("线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位.线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),但是它可与同属一个进程的其他的线程共享进程所拥有的全部资源.")]),t._v(" "),e("p",[t._v("一个线程可以创建和撤销另一个线程;同一个进程中的多个线程之间可以并发执行.")]),t._v(" "),e("p",[t._v("进程和线程的主要差别在于它们是不同的操作系统资源管理方式。进程有独立的地址空间,一个进程崩溃后,在保护模式下不会对其它进程产生影响,而线程只是一个进程中的不同执行路径。线程有自己的堆栈和局部变量,但线程之间没有单独的地址空间,一个线程死掉就等于整个进程死掉,所以多进程的程序要比多线程的程序健壮,但在进程切换时,耗费资源较大,效率要差一些。但对于一些要求同时进行并且又要共享某些变量的并发操作,只能用线程,不能用进程。如果有兴趣深入的话,我建议你们看看《现代操作系统》或者《操作系统的设计与实现》。对就个问题说得比较清楚。")])])}],!1,null,null,null);n.options.__file="进程和线程的区别-猎豹-美团.md";_.default=n.exports}}]);

================================================
FILE: .vuepress/dist/assets/js/79.dbecc3a8.js
================================================
(window.webpackJsonp=window.webpackJsonp||[]).push([[79],{244:function(e,r,n){"use strict";n.r(r);var t=n(0),i=Object(t.a)({},function(){var e=this,r=e.$createElement,n=e._self._c||r;return n("div",{staticClass:"content"},[e._m(0),e._v(" "),n("p",[n("a",{attrs:{href:"https://www.zhihu.com/question/39440766",target:"_blank",rel:"noopener noreferrer"}},[e._v("为什么 Android 要采用 Binder 作为 IPC 机制?"),n("OutboundLink")],1)]),e._v(" "),n("ul",[n("li",[n("a",{attrs:{href:"http://gityuan.com/2016/09/04/binder-start-service/",target:"_blank",rel:"noopener noreferrer"}},[e._v("彻底理解Android Binder通信架构"),n("OutboundLink")],1)]),e._v(" "),n("li",[n("a",{attrs:{href:"http://baronzhang.com/blog/Android/%E5%86%99%E7%BB%99-Android-%E5%BA%94%E7%94%A8%E5%B7%A5%E7%A8%8B%E5%B8%88%E7%9A%84-Binder-%E5%8E%9F%E7%90%86%E5%89%96%E6%9E%90/",target:"_blank",rel:"noopener noreferrer"}},[e._v("写给-Android-应用工程师的-Binder-原理剖析"),n("OutboundLink")],1)]),e._v(" "),n("li",[n("a",{attrs:{href:"https://blog.csdn.net/prike/article/details/70195608",target:"_blank",rel:"noopener noreferrer"}},[e._v("IBinder, BBinder和BpBinder"),n("OutboundLink")],1)]),e._v(" "),n("li",[n("a",{attrs:{href:"http://blog4jimmy.com/2018/01/356.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("BpBinder、BBinder和IInterface的关系"),n("OutboundLink")],1)])]),e._v(" "),e._m(1),e._v(" "),n("ul",[n("li",[n("a",{attrs:{href:"https://blog.csdn.net/luoshengyang/article/details/6618363",target:"_blank",rel:"noopener noreferrer"}},[e._v("Android进程间通信(IPC)机制Binder简要介绍和学习计划"),n("OutboundLink")],1)]),e._v(" "),n("li",[n("a",{attrs:{href:"https://blog.csdn.net/luoshengyang/article/details/6621566",target:"_blank",rel:"noopener noreferrer"}},[e._v("浅谈Service Manager成为Android进程间通信(IPC)机制Binder守护进程之路"),n("OutboundLink")],1)]),e._v(" "),n("li",[n("a",{attrs:{href:"https://blog.csdn.net/luoshengyang/article/details/6627260",target:"_blank",rel:"noopener noreferrer"}},[e._v("浅谈Android系统进程间通信(IPC)机制Binder中的Server和Client获得Service Manager接口之路"),n("OutboundLink")],1)]),e._v(" "),n("li",[n("a",{attrs:{href:"https://blog.csdn.net/luoshengyang/article/details/6629298",target:"_blank",rel:"noopener noreferrer"}},[e._v("Android系统进程间通信(IPC)机制Binder中的Server启动过程源代码分析"),n("OutboundLink")],1)]),e._v(" "),n("li",[n("a",{attrs:{href:"https://blog.csdn.net/luoshengyang/article/details/6633311",target:"_blank",rel:"noopener noreferrer"}},[e._v("Android系统进程间通信(IPC)机制Binder中的Client获得Server远程接口过程源代码分析"),n("OutboundLink")],1)]),e._v(" "),n("li",[n("a",{attrs:{href:"https://blog.csdn.net/luoshengyang/article/details/6642463",target:"_blank",rel:"noopener noreferrer"}},[e._v("Android系统进程间通信Binder机制在应用程序框架层的Java接口源代码分析"),n("OutboundLink")],1)])])])},[function(){var e=this.$createElement,r=this._self._c||e;return r("h4",{attrs:{id:"进程间通讯机制binder"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#进程间通讯机制binder","aria-hidden":"true"}},[this._v("#")]),this._v(" 进程间通讯机制Binder")])},function(){var e=this.$createElement,r=this._self._c||e;return r("p",[r("strong",[this._v("老罗系列:")])])}],!1,null,null,null);i.options.__file="进程间通讯机制Binder.md";r.default=i.exports}}]);

================================================
FILE: .vuepress/dist/assets/js/8.a05ad03a.js
================================================
(window.webpackJsonp=window.webpackJsonp||[]).push([[8],{173:function(t,i,e){"use strict";e.r(i);var s=e(0),r=Object(s.a)({},function(){this.$createElement;this._self._c;return this._m(0)},[function(){var t=this.$createElement,i=this._self._c||t;return i("div",{staticClass:"content"},[i("h4",{attrs:{id:"service与activity之间通信的几种方式"}},[i("a",{staticClass:"header-anchor",attrs:{href:"#service与activity之间通信的几种方式","aria-hidden":"true"}},[this._v("#")]),this._v(" Service与Activity之间通信的几种方式")]),this._v(" "),i("ul",[i("li",[this._v("通过Binder对象")]),this._v(" "),i("li",[this._v("通过broadcast(广播)的形式")])])])}],!1,null,null,null);r.options.__file="AndroidService与Activity之间通信的几种方式.md";i.default=r.exports}}]);

================================================
FILE: .vuepress/dist/assets/js/80.160ca675.js
================================================
(window.webpackJsonp=window.webpackJsonp||[]).push([[80],{245:function(t,a,s){"use strict";s.r(a);var n=s(0),e=Object(n.a)({},function(){var t=this,a=t.$createElement,s=t._self._c||a;return s("div",{staticClass:"content"},[t._m(0),t._v(" "),t._m(1),t._v(" "),s("p",[s("a",{attrs:{href:"http://blog.csdn.net/cloud_huan/article/details/53081120",target:"_blank",rel:"noopener noreferrer"}},[t._v("LeakCanary核心原理源码浅析"),s("OutboundLink")],1)]),t._v(" "),t._m(2),t._v(" "),s("p",[t._v("无法回收无用的对象")]),t._v(" "),t._m(3),t._v(" "),s("p",[s("a",{attrs:{href:"http://blog.csdn.net/luoshengyang/article/details/6817933",target:"_blank",rel:"noopener noreferrer"}},[t._v("Android应用程序消息处理机制(Looper、Handler)分析"),s("OutboundLink")],1)]),t._v(" "),t._m(4),t._v(" "),s("p",[s("a",{attrs:{href:"http://blog.csdn.net/hackooo/article/details/48395765/",target:"_blank",rel:"noopener noreferrer"}},[t._v("Java JNI实现原理初探"),s("OutboundLink")],1)]),t._v(" "),t._m(5),t._v(" "),s("p",[t._v("okhttp、glide")]),t._v(" "),t._m(6),t._v(" "),s("ul",[s("li",[s("a",{attrs:{href:"http://yukai.space/2017/05/08/java%E7%BA%BF%E7%A8%8B%E6%B1%A0%E7%9A%84%E4%BD%BF%E7%94%A8/",target:"_blank",rel:"noopener noreferrer"}},[t._v("java线程池的使用"),s("OutboundLink")],1)]),t._v(" "),s("li",[s("a",{attrs:{href:"https://juejin.im/post/5906b6e78d6d810058dab1bf",target:"_blank",rel:"noopener noreferrer"}},[t._v("Java 线程池的理论与实践"),s("OutboundLink")],1)])]),t._v(" "),t._m(7),t._v(" "),s("p",[s("a",{attrs:{href:"http://www.infoq.com/cn/articles/java-se-16-synchronized",target:"_blank",rel:"noopener noreferrer"}},[t._v("Java SE1.6中的Synchronized"),s("OutboundLink")],1)]),t._v(" "),t._m(8),t._v(" "),t._m(9),t._v(" "),t._m(10),t._v(" "),s("p",[t._v("防止CPU指令重排序")]),t._v(" "),t._m(11),t._v(" "),t._m(12),t._m(13),t._v(" "),s("p",[t._v('For example,  "A man, a plan, a canal: Panama" is a palindrome.  "race a car" is not a palindrome.')]),t._v(" "),s("p",[t._v("Note:  Have you consider that the string might be empty? This is a good question to ask during an interview.  For the purpose of this problem, we define empty string as valid palindrome.")]),t._v(" "),t._m(14),t._m(15),t._v(" "),s("p",[t._v("用两根绳子,一个绳子两头烧,一个一头烧。一根烧完后,把另外一根也两头烧。所以是30+45 共75分钟。")])])},[function(){var t=this.$createElement,a=this._self._c||t;return a("h3",{attrs:{id:"阿里面试题"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#阿里面试题","aria-hidden":"true"}},[this._v("#")]),this._v(" 阿里面试题")])},function(){var t=this.$createElement,a=this._self._c||t;return a("h4",{attrs:{id:"leakcanary-实现原理"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#leakcanary-实现原理","aria-hidden":"true"}},[this._v("#")]),this._v(" LeakCanary 实现原理")])},function(){var t=this.$createElement,a=this._self._c||t;return a("h4",{attrs:{id:"内存泄露的本质"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#内存泄露的本质","aria-hidden":"true"}},[this._v("#")]),this._v(" 内存泄露的本质")])},function(){var t=this.$createElement,a=this._self._c||t;return a("h4",{attrs:{id:"handler-队列阻塞算法、在android中的地位、如何自己实现?"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#handler-队列阻塞算法、在android中的地位、如何自己实现?","aria-hidden":"true"}},[this._v("#")]),this._v(" Handler 队列阻塞算法、在Android中的地位、如何自己实现?")])},function(){var t=this.$createElement,a=this._self._c||t;return a("h4",{attrs:{id:"c-和-java-如何通信?jni原理"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#c-和-java-如何通信?jni原理","aria-hidden":"true"}},[this._v("#")]),this._v(" C 和 java 如何通信?JNI原理")])},function(){var t=this.$createElement,a=this._self._c||t;return a("h4",{attrs:{id:"比较熟悉的开源项目源码分析"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#比较熟悉的开源项目源码分析","aria-hidden":"true"}},[this._v("#")]),this._v(" 比较熟悉的开源项目源码分析")])},function(){var t=this.$createElement,a=this._self._c||t;return a("h4",{attrs:{id:"线程池定制、源码分析"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#线程池定制、源码分析","aria-hidden":"true"}},[this._v("#")]),this._v(" 线程池定制、源码分析")])},function(){var t=this.$createElement,a=this._self._c||t;return a("h4",{attrs:{id:"虚拟机如何实现的synchronized?"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#虚拟机如何实现的synchronized?","aria-hidden":"true"}},[this._v("#")]),this._v(" 虚拟机如何实现的synchronized?")])},function(){var t=this.$createElement,a=this._self._c||t;return a("h4",{attrs:{id:"一个文件中有100万个整数,由空格分开,在程序中判断用户输入的整数是否在此文件中。说出最优的方法"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#一个文件中有100万个整数,由空格分开,在程序中判断用户输入的整数是否在此文件中。说出最优的方法","aria-hidden":"true"}},[this._v("#")]),this._v(" 一个文件中有100万个整数,由空格分开,在程序中判断用户输入的整数是否在此文件中。说出最优的方法")])},function(){var t=this.$createElement,a=this._self._c||t;return a("h4",{attrs:{id:"两个进程同时要求写或者读,能不能实现?如何防止进程的同步?"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#两个进程同时要求写或者读,能不能实现?如何防止进程的同步?","aria-hidden":"true"}},[this._v("#")]),this._v(" 两个进程同时要求写或者读,能不能实现?如何防止进程的同步?")])},function(){var t=this.$createElement,a=this._self._c||t;return a("h4",{attrs:{id:"volatile-的意义?"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#volatile-的意义?","aria-hidden":"true"}},[this._v("#")]),this._v(" volatile 的意义?")])},function(){var t=this.$createElement,a=this._self._c||t;return a("h4",{attrs:{id:"单例"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#单例","aria-hidden":"true"}},[this._v("#")]),this._v(" 单例")])},function(){var t=this,a=t.$createElement,s=t._self._c||a;return s("div",{staticClass:"language-java extra-class"},[s("pre",{pre:!0,attrs:{class:"language-java"}},[s("code",[s("span",{attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),s("span",{attrs:{class:"token keyword"}},[t._v("class")]),t._v(" "),s("span",{attrs:{class:"token class-name"}},[t._v("Singleton")]),s("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n"),s("span",{attrs:{class:"token keyword"}},[t._v("private")]),t._v(" "),s("span",{attrs:{class:"token keyword"}},[t._v("volatile")]),t._v(" "),s("span",{attrs:{class:"token keyword"}},[t._v("static")]),t._v(" Singleton mSingleton"),s("span",{attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{attrs:{class:"token keyword"}},[t._v("private")]),t._v(" "),s("span",{attrs:{class:"token function"}},[t._v("Singleton")]),s("span",{attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n"),s("span",{attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),s("span",{attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),s("span",{attrs:{class:"token keyword"}},[t._v("static")]),t._v(" Singleton "),s("span",{attrs:{class:"token function"}},[t._v("getInstance")]),s("span",{attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n  "),s("span",{attrs:{class:"token keyword"}},[t._v("if")]),s("span",{attrs:{class:"token punctuation"}},[t._v("(")]),t._v("mSingleton "),s("span",{attrs:{class:"token operator"}},[t._v("==")]),t._v(" null"),s("span",{attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\\\\A\n    "),s("span",{attrs:{class:"token keyword"}},[t._v("synchronized")]),s("span",{attrs:{class:"token punctuation"}},[t._v("(")]),t._v("Singleton"),s("span",{attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{attrs:{class:"token keyword"}},[t._v("class")]),s("span",{attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\\\\C\n     "),s("span",{attrs:{class:"token keyword"}},[t._v("if")]),s("span",{attrs:{class:"token punctuation"}},[t._v("(")]),t._v("mSingleton "),s("span",{attrs:{class:"token operator"}},[t._v("==")]),t._v(" null"),s("span",{attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n      mSingleton "),s("span",{attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{attrs:{class:"token keyword"}},[t._v("new")]),t._v(" "),s("span",{attrs:{class:"token class-name"}},[t._v("Singleton")]),s("span",{attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\\\\B\n      "),s("span",{attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n    "),s("span",{attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n    "),s("span",{attrs:{class:"token keyword"}},[t._v("return")]),t._v(" mSingleton"),s("span",{attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n  "),s("span",{attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),s("span",{attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])])},function(){var t=this.$createElement,a=this._self._c||t;return a("h4",{attrs:{id:"given-a-string-determine-if-it-is-a-palindrome(回文,如果不清楚,按字面意思脑补下)-considering-only-alphanumeric-characters-and-ignoring-cases"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#given-a-string-determine-if-it-is-a-palindrome(回文,如果不清楚,按字面意思脑补下)-considering-only-alphanumeric-characters-and-ignoring-cases","aria-hidden":"true"}},[this._v("#")]),this._v(" Given a string, determine if it is a palindrome(回文,如果不清楚,按字面意思脑补下), considering only alphanumeric characters and ignoring cases.")])},function(){var t=this,a=t.$createElement,s=t._self._c||a;return s("div",{staticClass:"language-java extra-class"},[s("pre",{pre:!0,attrs:{class:"language-java"}},[s("code",[s("span",{attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),s("span",{attrs:{class:"token keyword"}},[t._v("boolean")]),t._v(" "),s("span",{attrs:{class:"token function"}},[t._v("isPalindrome")]),s("span",{attrs:{class:"token punctuation"}},[t._v("(")]),t._v("String palindrome"),s("span",{attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t\t"),s("span",{attrs:{class:"token keyword"}},[t._v("char")]),s("span",{attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" palindromes "),s("span",{attrs:{class:"token operator"}},[t._v("=")]),t._v(" palidrome"),s("span",{attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{attrs:{class:"token function"}},[t._v("toCharArray")]),s("span",{attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n \t\t"),s("span",{attrs:{class:"token keyword"}},[t._v("if")]),s("span",{attrs:{class:"token punctuation"}},[t._v("(")]),t._v("palindromes"),s("span",{attrs:{class:"token punctuation"}},[t._v(".")]),t._v("lengh "),s("span",{attrs:{class:"token operator"}},[t._v("==")]),t._v(" "),s("span",{attrs:{class:"token number"}},[t._v("0")]),s("span",{attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t \t\t"),s("span",{attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),s("span",{attrs:{class:"token boolean"}},[t._v("true")]),t._v("\n \t\t"),s("span",{attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n \t\tArraylist"),s("span",{attrs:{class:"token generics function"}},[s("span",{attrs:{class:"token punctuation"}},[t._v("<")]),t._v("Char"),s("span",{attrs:{class:"token punctuation"}},[t._v(">")])]),t._v(" temp "),s("span",{attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{attrs:{class:"token keyword"}},[t._v("new")]),t._v(" "),s("span",{attrs:{class:"token class-name"}},[t._v("Arraylist")]),s("span",{attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n \t\t"),s("span",{attrs:{class:"token keyword"}},[t._v("for")]),s("span",{attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{attrs:{class:"token keyword"}},[t._v("int")]),t._v(" i"),s("span",{attrs:{class:"token operator"}},[t._v("=")]),s("span",{attrs:{class:"token number"}},[t._v("0")]),s("span",{attrs:{class:"token punctuation"}},[t._v(";")]),t._v("i"),s("span",{attrs:{class:"token operator"}},[t._v("<")]),t._v("palindromes"),s("span",{attrs:{class:"token punctuation"}},[t._v(".")]),t._v("length"),s("span",{attrs:{class:"token punctuation"}},[t._v(";")]),t._v("i"),s("span",{attrs:{class:"token operator"}},[t._v("++")]),s("span",{attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n \t\t"),s("span",{attrs:{class:"token keyword"}},[t._v("if")]),s("span",{attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{attrs:{class:"token punctuation"}},[t._v("(")]),t._v("palindromes"),s("span",{attrs:{class:"token punctuation"}},[t._v("[")]),t._v("i"),s("span",{attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{attrs:{class:"token operator"}},[t._v(">")]),s("span",{attrs:{class:"token string"}},[t._v("'a'")]),t._v(" "),s("span",{attrs:{class:"token operator"}},[t._v("&&")]),t._v(" palindromes"),s("span",{attrs:{class:"token punctuation"}},[t._v("[")]),t._v("i"),s("span",{attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{attrs:{class:"token operator"}},[t._v("<")]),s("span",{attrs:{class:"token string"}},[t._v("'z'")]),s("span",{attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{attrs:{class:"token operator"}},[t._v("||")]),t._v("palindromes"),s("span",{attrs:{class:"token punctuation"}},[t._v("[")]),t._v("i"),s("span",{attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{attrs:{class:"token operator"}},[t._v(">")]),s("span",{attrs:{class:"token string"}},[t._v("'A'")]),t._v(" "),s("span",{attrs:{class:"token operator"}},[t._v("&&")]),t._v(" palindromes"),s("span",{attrs:{class:"token punctuation"}},[t._v("[")]),t._v("i"),s("span",{attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{attrs:{class:"token operator"}},[t._v("<")]),s("span",{attrs:{class:"token string"}},[t._v("'Z'")]),s("span",{attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n \t\ttemp"),s("span",{attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{attrs:{class:"token function"}},[t._v("add")]),s("span",{attrs:{class:"token punctuation"}},[t._v("(")]),t._v("palindromes"),s("span",{attrs:{class:"token punctuation"}},[t._v("[")]),t._v("i"),s("span",{attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{attrs:{class:"token function"}},[t._v("toLowerCase")]),s("span",{attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n \t\t"),s("span",{attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\t\t"),s("span",{attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n \t\t"),s("span",{attrs:{class:"token keyword"}},[t._v("for")]),s("span",{attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{attrs:{class:"token keyword"}},[t._v("int")]),t._v(" i"),s("span",{attrs:{class:"token operator"}},[t._v("=")]),s("span",{attrs:{class:"token number"}},[t._v("0")]),s("span",{attrs:{class:"token punctuation"}},[t._v(";")]),t._v("i"),s("span",{attrs:{class:"token operator"}},[t._v("<")]),t._v("temp"),s("span",{attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{attrs:{class:"token function"}},[t._v("size")]),s("span",{attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{attrs:{class:"token operator"}},[t._v("/")]),s("span",{attrs:{class:"token number"}},[t._v("2")]),s("span",{attrs:{class:"token punctuation"}},[t._v(";")]),t._v("i"),s("span",{attrs:{class:"token operator"}},[t._v("++")]),s("span",{attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n \t\t"),s("span",{attrs:{class:"token keyword"}},[t._v("if")]),s("span",{attrs:{class:"token punctuation"}},[t._v("(")]),t._v("temp"),s("span",{attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{attrs:{class:"token function"}},[t._v("get")]),s("span",{attrs:{class:"token punctuation"}},[t._v("(")]),t._v("i"),s("span",{attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{attrs:{class:"token operator"}},[t._v("!=")]),t._v(" temp"),s("span",{attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{attrs:{class:"token function"}},[t._v("get")]),s("span",{attrs:{class:"token punctuation"}},[t._v("(")]),t._v("temp"),s("span",{attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{attrs:{class:"token function"}},[t._v("size")]),s("span",{attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{attrs:{class:"token operator"}},[t._v("-")]),t._v("i"),s("span",{attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n \t\t"),s("span",{attrs:{class:"token comment"}},[t._v("//")]),t._v("\n \t\t"),s("span",{attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),s("span",{attrs:{class:"token boolean"}},[t._v("false")]),s("span",{attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n \t\t"),s("span",{attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n \t\t"),s("span",{attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n \t\t"),s("span",{attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),s("span",{attrs:{class:"token boolean"}},[t._v("true")]),s("span",{attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])])},function(){var t=this.$createElement,a=this._self._c||t;return a("h4",{attrs:{id:"烧一根不均匀的绳,从头烧到尾总共需要1个小时。现在有若干条材质相同的绳子,问如何用烧绳的方法来计时一个小时十五分钟呢"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#烧一根不均匀的绳,从头烧到尾总共需要1个小时。现在有若干条材质相同的绳子,问如何用烧绳的方法来计时一个小时十五分钟呢","aria-hidden":"true"}},[this._v("#")]),this._v(" 烧一根不均匀的绳,从头烧到尾总共需要1个小时。现在有若干条材质相同的绳子,问如何用烧绳的方法来计时一个小时十五分钟呢")])}],!1,null,null,null);e.options.__file="阿里巴巴.md";a.default=e.exports}}]);

================================================
FILE: .vuepress/dist/assets/js/9.981b483c.js
================================================
(window.webpackJsonp=window.webpackJsonp||[]).push([[9],{174:function(t,i,n){"use strict";n.r(i);var s=n(0),e=Object(s.a)({},function(){this.$createElement;this._self._c;return this._m(0)},[function(){var t=this.$createElement,i=this._self._c||t;return i("div",{staticClass:"content"},[i("h4",{attrs:{id:"android为每个应用程序分配的内存大小是多少-美团"}},[i("a",{staticClass:"header-anchor",attrs:{href:"#android为每个应用程序分配的内存大小是多少-美团","aria-hidden":"true"}},[this._v("#")]),this._v(" Android为每个应用程序分配的内存大小是多少-美团")]),this._v(" "),i("p",[this._v("android程序内存一般限制在16M,也有的是24M。近几年手机发展较快,一般都会分配两百兆左右,和具体机型有关。")])])}],!1,null,null,null);e.options.__file="Android为每个应用程序分配的内存大小是多少?-美团.md";i.default=e.exports}}]);

================================================
FILE: .vuepress/dist/assets/js/app.3c9e1f27.js
================================================
(window.webpackJsonp=window.webpackJsonp||[]).push([[0],[]]);!function(t){function e(e){for(var r,a,s=e[0],c=e[1],u=e[2],f=0,p=[];f<s.length;f++)a=s[f],i[a]&&p.push(i[a][0]),i[a]=0;for(r in c)Object.prototype.hasOwnProperty.call(c,r)&&(t[r]=c[r]);for(l&&l(e);p.length;)p.shift()();return o.push.apply(o,u||[]),n()}function n(){for(var t,e=0;e<o.length;e++){for(var n=o[e],r=!0,s=1;s<n.length;s++){var c=n[s];0!==i[c]&&(r=!1)}r&&(o.splice(e--,1),t=a(a.s=n[0]))}return t}var r={},i={1:0},o=[];function a(e){if(r[e])return r[e].exports;var n=r[e]={i:e,l:!1,exports:{}};return t[e].call(n.exports,n,n.exports,a),n.l=!0,n.exports}a.e=function(t){var e=[],n=i[t];if(0!==n)if(n)e.push(n[2]);else{var r=new Promise(function(e,r){n=i[t]=[e,r]});e.push(n[2]=r);var o,s=document.getElementsByTagName("head")[0],c=document.createElement("script");c.charset="utf-8",c.timeout=120,a.nc&&c.setAttribute("nonce",a.nc),c.src=function(t){return a.p+"assets/js/"+({}[t]||t)+"."+{2:"23124c79",3:"888b2472",4:"fe41294f",5:"b8a0041f",6:"2e2bf07a",7:"e7997178",8:"a05ad03a",9:"981b483c",10:"9e736429",11:"79dd85f0",12:"73c7bb22",13:"f677d7c4",14:"f2b11944",15:"38abfb77",16:"3397fcb5",17:"f8e05c59",18:"98a9b878",19:"5a8d7fbe",20:"8d6b010a",21:"6c600605",22:"c7ebece6",23:"9b1d1cfc",24:"489e8ac8",25:"1d798f32",26:"e477ad95",27:"d297fac7",28:"c36b0549",29:"2f26e65a",30:"1c7e4986",31:"32f7c857",32:"a13ca202",33:"90bf4621",34:"bb5f949f",35:"b283dac3",36:"3032c4bb",37:"6ff405bc",38:"f6a52e06",39:"7ce0a0f5",40:"1662d618",41:"2a812c43",42:"5e53f08f",43:"c4fa5c7d",44:"ae8007c2",45:"9cbb4e19",46:"2249db82",47:"1b41f358",48:"387309f2",49:"2316ffc9",50:"16f26c0e",51:"ad1837d2",52:"53997134",53:"efacfabf",54:"ec024a7e",55:"90a5cae5",56:"c99b5c22",57:"99528377",58:"e0be91a5",59:"76323003",60:"1fff84d3",61:"d86a49ac",62:"7b2b2166",63:"3de4be6c",64:"f177712d",65:"a6025451",66:"61b436f9",67:"88898059",68:"52455085",69:"d4a08d30",70:"52acb40b",71:"27515e96",72:"0d8204b2",73:"a431f4a6",74:"e30eb438",75:"6317c6b5",76:"ec7c8c11",77:"50e04b3f",78:"759c37d0",79:"dbecc3a8",80:"160ca675"}[t]+".js"}(t),o=function(e){c.onerror=c.onload=null,clearTimeout(u);var n=i[t];if(0!==n){if(n){var r=e&&("load"===e.type?"missing":e.type),o=e&&e.target&&e.target.src,a=new Error("Loading chunk "+t+" failed.\n("+r+": "+o+")");a.type=r,a.request=o,n[1](a)}i[t]=void 0}};var u=setTimeout(function(){o({type:"timeout",target:c})},12e4);c.onerror=c.onload=o,s.appendChild(c)}return Promise.all(e)},a.m=t,a.c=r,a.d=function(t,e,n){a.o(t,e)||Object.defineProperty(t,e,{enumerable:!0,get:n})},a.r=function(t){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})},a.t=function(t,e){if(1&e&&(t=a(t)),8&e)return t;if(4&e&&"object"==typeof t&&t&&t.__esModule)return t;var n=Object.create(null);if(a.r(n),Object.defineProperty(n,"default",{enumerable:!0,value:t}),2&e&&"string"!=typeof t)for(var r in t)a.d(n,r,function(e){return t[e]}.bind(null,r));return n},a.n=function(t){var e=t&&t.__esModule?function(){return t.default}:function(){return t};return a.d(e,"a",e),e},a.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},a.p="/",a.oe=function(t){throw console.error(t),t};var s=window.webpackJsonp=window.webpackJsonp||[],c=s.push.bind(s);s.push=e,s=s.slice();for(var u=0;u<s.length;u++)e(s[u]);var l=c;o.push([88,0]),n()}([function(t,e,n){"use strict";function r(t,e,n,r,i,o,a,s){var c,u="function"==typeof t?t.options:t;if(e&&(u.render=e,u.staticRenderFns=n,u._compiled=!0),r&&(u.functional=!0),o&&(u._scopeId="data-v-"+o),a?(c=function(t){(t=t||this.$vnode&&this.$vnode.ssrContext||this.parent&&this.parent.$vnode&&this.parent.$vnode.ssrContext)||"undefined"==typeof __VUE_SSR_CONTEXT__||(t=__VUE_SSR_CONTEXT__),i&&i.call(this,t),t&&t._registeredComponents&&t._registeredComponents.add(a)},u._ssrRegister=c):i&&(c=s?function(){i.call(this,this.$root.$options.shadowRoot)}:i),c)if(u.functional){u._injectStyles=c;var l=u.render;u.render=function(t,e){return c.call(e),l(t,e)}}else{var f=u.beforeCreate;u.beforeCreate=f?[].concat(f,c):[c]}return{exports:t,options:u}}n.d(e,"a",function(){return r})},function(t,e,n){var r=n(69)("wks"),i=n(22),o=n(2).Symbol,a="function"==typeof o;(t.exports=function(t){return r[t]||(r[t]=a&&o[t]||(a?o:i)("Symbol."+t))}).store=r},function(t,e){var n=t.exports="undefined"!=typeof window&&window.Math==Math?window:"undefined"!=typeof self&&self.Math==Math?self:Function("return this")();"number"==typeof __g&&(__g=n)},function(t,e,n){var r=n(2),i=n(13),o=n(10),a=n(11),s=n(9),c=function(t,e,n){var u,l,f,p,h=t&c.F,d=t&c.G,v=t&c.S,E=t&c.P,m=t&c.B,B=d?r:v?r[e]||(r[e]={}):(r[e]||{}).prototype,A=d?i:i[e]||(i[e]={}),y=A.prototype||(A.prototype={});for(u in d&&(n=e),n)f=((l=!h&&B&&void 0!==B[u])?B:n)[u],p=m&&l?s(f,r):E&&"function"==typeof f?s(Function.call,f):f,B&&a(B,u,f,t&c.U),A[u]!=f&&o(A,u,p),E&&y[u]!=f&&(y[u]=f)};r.core=i,c.F=1,c.G=2,c.S=4,c.P=8,c.B=16,c.W=32,c.U=64,c.R=128,t.exports=c},function(t,e){t.exports=function(t){return"object"==typeof t?null!==t:"function"==typeof t}},function(t,e){t.exports=function(t){try{return!!t()}catch(t){return!0}}},function(t,e,n){t.exports=!n(5)(function(){return 7!=Object.defineProperty({},"a",{get:function(){return 7}}).a})},function(t,e,n){var r=n(8),i=n(70),o=n(71),a=Object.defineProperty;e.f=n(6)?Object.defineProperty:function(t,e,n){if(r(t),e=o(e,!0),r(n),i)try{return a(t,e,n)}catch(t){}if("get"in n||"set"in n)throw TypeError("Accessors not supported!");return"value"in n&&(t[e]=n.value),t}},function(t,e,n){var r=n(4);t.exports=function(t){if(!r(t))throw TypeError(t+" is not an object!");return t}},function(t,e,n){var r=n(21);t.exports=function(t,e,n){if(r(t),void 0===e)return t;switch(n){case 1:return function(n){return t.call(e,n)};case 2:return function(n,r){return t.call(e,n,r)};case 3:return function(n,r,i){return t.call(e,n,r,i)}}return function(){return t.apply(e,arguments)}}},function(t,e,n){var r=n(7),i=n(52);t.exports=n(6)?function(t,e,n){return r.f(t,e,i(1,n))}:function(t,e,n){return t[e]=n,t}},function(t,e,n){var r=n(2),i=n(10),o=n(14),a=n(22)("src"),s=Function.toString,c=(""+s).split("toString");n(13).inspectSource=function
Download .txt
gitextract_5j775t_1/

├── .gitignore
├── .vuepress/
│   └── dist/
│       ├── 404.html
│       ├── assets/
│       │   ├── css/
│       │   │   └── 0.styles.33d1fe29.css
│       │   └── js/
│       │       ├── 10.9e736429.js
│       │       ├── 11.79dd85f0.js
│       │       ├── 12.73c7bb22.js
│       │       ├── 13.f677d7c4.js
│       │       ├── 14.f2b11944.js
│       │       ├── 15.38abfb77.js
│       │       ├── 16.3397fcb5.js
│       │       ├── 17.f8e05c59.js
│       │       ├── 18.98a9b878.js
│       │       ├── 19.5a8d7fbe.js
│       │       ├── 2.23124c79.js
│       │       ├── 20.8d6b010a.js
│       │       ├── 21.6c600605.js
│       │       ├── 22.c7ebece6.js
│       │       ├── 23.9b1d1cfc.js
│       │       ├── 24.489e8ac8.js
│       │       ├── 25.1d798f32.js
│       │       ├── 26.e477ad95.js
│       │       ├── 27.d297fac7.js
│       │       ├── 28.c36b0549.js
│       │       ├── 29.2f26e65a.js
│       │       ├── 3.888b2472.js
│       │       ├── 30.1c7e4986.js
│       │       ├── 31.32f7c857.js
│       │       ├── 32.a13ca202.js
│       │       ├── 33.90bf4621.js
│       │       ├── 34.bb5f949f.js
│       │       ├── 35.b283dac3.js
│       │       ├── 36.3032c4bb.js
│       │       ├── 37.6ff405bc.js
│       │       ├── 38.f6a52e06.js
│       │       ├── 39.7ce0a0f5.js
│       │       ├── 4.fe41294f.js
│       │       ├── 40.1662d618.js
│       │       ├── 41.2a812c43.js
│       │       ├── 42.5e53f08f.js
│       │       ├── 43.c4fa5c7d.js
│       │       ├── 44.ae8007c2.js
│       │       ├── 45.9cbb4e19.js
│       │       ├── 46.2249db82.js
│       │       ├── 47.1b41f358.js
│       │       ├── 48.387309f2.js
│       │       ├── 49.2316ffc9.js
│       │       ├── 5.b8a0041f.js
│       │       ├── 50.16f26c0e.js
│       │       ├── 51.ad1837d2.js
│       │       ├── 52.53997134.js
│       │       ├── 53.efacfabf.js
│       │       ├── 54.ec024a7e.js
│       │       ├── 55.90a5cae5.js
│       │       ├── 56.c99b5c22.js
│       │       ├── 57.99528377.js
│       │       ├── 58.e0be91a5.js
│       │       ├── 59.76323003.js
│       │       ├── 6.2e2bf07a.js
│       │       ├── 60.1fff84d3.js
│       │       ├── 61.d86a49ac.js
│       │       ├── 62.7b2b2166.js
│       │       ├── 63.3de4be6c.js
│       │       ├── 64.f177712d.js
│       │       ├── 65.a6025451.js
│       │       ├── 66.61b436f9.js
│       │       ├── 67.88898059.js
│       │       ├── 68.52455085.js
│       │       ├── 69.d4a08d30.js
│       │       ├── 7.e7997178.js
│       │       ├── 70.52acb40b.js
│       │       ├── 71.27515e96.js
│       │       ├── 72.0d8204b2.js
│       │       ├── 73.a431f4a6.js
│       │       ├── 74.e30eb438.js
│       │       ├── 75.6317c6b5.js
│       │       ├── 76.ec7c8c11.js
│       │       ├── 77.50e04b3f.js
│       │       ├── 78.759c37d0.js
│       │       ├── 79.dbecc3a8.js
│       │       ├── 8.a05ad03a.js
│       │       ├── 80.160ca675.js
│       │       ├── 9.981b483c.js
│       │       └── app.3c9e1f27.js
│       ├── index.html
│       └── source/
│           ├── index.html
│           └── interview/
│               ├── ==和equals和hashCode的区别-乐视.html
│               ├── ANR定位和修正.html
│               ├── AndroidService与Activity之间通信的几种方式.html
│               ├── Android为每个应用程序分配的内存大小是多少?-美团.html
│               ├── Android代码中实现WAP方式联网-360.html
│               ├── Android动画框架实现原理.html
│               ├── Android各个版本API的区别.html
│               ├── Android属性动画特性-乐视-小米.html
│               ├── ArrayMap对比HashMap.html
│               ├── ContentProvider-乐视.html
│               ├── Glide源码解析.html
│               ├── Handler消息处理.html
│               ├── HashMap的实现原理-美团.html
│               ├── LinearLayout对比RelativeLayout-百度.html
│               ├── Requestlayout,onlayout,onDraw,DrawChild区别与联系-猎豹.html
│               ├── Touch事件传递流程-小米.html
│               ├── Ubuntu编译安卓系统-百度.html
│               ├── activity-window-view三者的差别-fragment的特点-360.html
│               ├── fragment生命周期.html
│               ├── hashmap和hashtable的区别-乐视-小米.html
│               ├── index.html
│               ├── int-char-long各占多少字节数.html
│               ├── intentService作用是什么,AIDL解决了什么问题?-小米.html
│               ├── int与integer的区别.html
│               ├── invalidate和postInvalidate的区别及使用-百度.html
│               ├── java.html
│               ├── java多态-乐视.html
│               ├── java排序查找算法-美团.html
│               ├── java状态机.html
│               ├── launchmode应用场景-百度-小米-乐视.html
│               ├── string-stringbuffer-stringbuilder区别-小米-乐视-百度.html
│               ├── view绘制流程-百度.html
│               ├── volley解析-美团-乐视.html
│               ├── 什么导致线程阻塞-58-美团.html
│               ├── 什么情况导致oom-乐视-美团.html
│               ├── 什么情况导致内存泄漏-美团.html
│               ├── 优化自定义view百度-乐视-小米.html
│               ├── 低版本SDK实现高版本api-小米.html
│               ├── 内存模型.html
│               ├── 内部类.html
│               ├── 内部类的作用-乐视.html
│               ├── 列举java的集合和继承关系-百度-美团.html
│               ├── 哪些情况下的对象会被垃圾回收机制处理掉-美团-小米.html
│               ├── 图片.html
│               ├── 垃圾回收.html
│               ├── 多线程-360.html
│               ├── 如何保证service在后台不被kill.html
│               ├── 如何导入外部数据库-小米.html
│               ├── 容器类之间的区别-乐视-美团.html
│               ├── 常用Framework模块原理.html
│               ├── 并发编程-猎豹.html
│               ├── 性能优化.html
│               ├── 抽象类和接口-360.html
│               ├── 抽象类的意义-乐视.html
│               ├── 接口的意义-百度.html
│               ├── 描述一次网络请求的流程-新浪.html
│               ├── 插件化.html
│               ├── 数据库.html
│               ├── 本地广播和全局广播有什么差别.html
│               ├── 架构分析.html
│               ├── 架构设计-搜狐.html
│               ├── 泛型中extends和super的区别.html
│               ├── 深入研究的知识点.html
│               ├── 父类的静态方法能否被子类重写-猎豹.html
│               ├── 百度.html
│               ├── 算法.html
│               ├── 线程 线程池原理-腾讯.html
│               ├── 线程同步-百度.html
│               ├── 网络.html
│               ├── 腾讯.html
│               ├── 虚拟机-百度-乐视.html
│               ├── 设计模式.html
│               ├── 进程和线程的区别-猎豹-美团.html
│               ├── 进程间通讯机制Binder.html
│               └── 阿里巴巴.html
├── README.md
├── configs/
│   └── sorts.json
├── deploy.sh
├── docs/
│   ├── 404.html
│   ├── Android/
│   │   ├── ANR定位和修正.html
│   │   ├── AOP技术方案.html
│   │   ├── Apk打包流程.html
│   │   ├── ArrayMap对比HashMap.html
│   │   ├── Art Dalvik区别.html
│   │   ├── Binder原理.html
│   │   ├── ContentProvider-乐视.html
│   │   ├── Framework.html
│   │   ├── Glide源码解析.html
│   │   ├── Gradle.html
│   │   ├── Handler原理.html
│   │   ├── Kotlin.html
│   │   ├── LinearLayout对比RelativeLayout-百度.html
│   │   ├── RecyclerView缓存原理.html
│   │   ├── SP原理及优化.html
│   │   ├── Service与Activity之间通信的几种方式.html
│   │   ├── Touch事件传递流程-小米.html
│   │   ├── Ubuntu编译安卓系统-百度.html
│   │   ├── dex,odex,oat,vdex,art文件结构.html
│   │   ├── fragment生命周期.html
│   │   ├── index.html
│   │   ├── launchmode应用场景-百度-小米-乐视.html
│   │   ├── onSaveInstanceState原理.html
│   │   ├── view绘制流程-百度.html
│   │   ├── volley解析-美团-乐视.html
│   │   ├── 为什么不能使用Application Context显示 Dialog.html
│   │   ├── 什么情况导致oom-乐视-美团.html
│   │   ├── 什么情况导致内存泄漏-美团.html
│   │   ├── 动画框架实现原理.html
│   │   ├── 垃圾回收.html
│   │   ├── 屏幕刷新机制-腾讯.html
│   │   ├── 属性动画特性-乐视-小米.html
│   │   ├── 插件化.html
│   │   ├── 数据库.html
│   │   ├── 本地广播和全局广播有什么差别.html
│   │   ├── 架构范式.html
│   │   ├── 每个应用程序分配的内存大小是多少?-美团.html
│   │   ├── 注解处理器APT.html
│   │   ├── 渲染机制原理.html
│   │   └── 设计模式.html
│   ├── Java/
│   │   ├── ClassNotFoundException和NoClassDefFoundError的区别.html
│   │   ├── Exception 和 Error 有何区别?.html
│   │   ├── HashMap原理-美团.html
│   │   ├── JIT 编译器.html
│   │   ├── JavaBean HashCode怎么写.html
│   │   ├── LRUCache.html
│   │   ├── Wait、Sleep和Yield方法的区别.html
│   │   ├── hashmap和hashtable的区别-乐视-小米.html
│   │   ├── index.html
│   │   ├── 内存模型.html
│   │   ├── 列举java的集合和继承关系-百度-美团.html
│   │   ├── 动态代理.html
│   │   ├── 多态.html
│   │   ├── 大文件排序.html
│   │   ├── 容器类之间的区别-乐视-美团.html
│   │   ├── 泛型.html
│   │   ├── 父类的静态方法能否被子类重写-猎豹.html
│   │   ├── 线程&&线程池原理-腾讯.html
│   │   ├── 虚拟机-百度-乐视.html
│   │   ├── 进程和线程的区别-猎豹-美团.html
│   │   └── 锁&&并发.html
│   ├── assets/
│   │   ├── css/
│   │   │   └── 0.styles.aa90f834.css
│   │   └── js/
│   │       ├── 10.c2573781.js
│   │       ├── 11.ae832302.js
│   │       ├── 12.3343ef8e.js
│   │       ├── 13.5770262b.js
│   │       ├── 14.e70957ef.js
│   │       ├── 15.aa48ebad.js
│   │       ├── 16.48c282a5.js
│   │       ├── 17.83878a78.js
│   │       ├── 18.f413419c.js
│   │       ├── 19.858374d0.js
│   │       ├── 2.9b17f659.js
│   │       ├── 20.52095afd.js
│   │       ├── 21.aacaa098.js
│   │       ├── 22.d5fe6804.js
│   │       ├── 23.f7343788.js
│   │       ├── 24.d281157a.js
│   │       ├── 25.1c160e8c.js
│   │       ├── 26.5120699f.js
│   │       ├── 27.699515ad.js
│   │       ├── 28.876150cf.js
│   │       ├── 29.ee8cd5bf.js
│   │       ├── 3.8be43c93.js
│   │       ├── 30.714ef1cd.js
│   │       ├── 31.88fa871a.js
│   │       ├── 32.f032c410.js
│   │       ├── 33.a911dcef.js
│   │       ├── 34.2aabf7dc.js
│   │       ├── 35.1cdad8e8.js
│   │       ├── 36.2c4b17cd.js
│   │       ├── 37.1c5cf1ee.js
│   │       ├── 38.12af5809.js
│   │       ├── 39.85f91710.js
│   │       ├── 4.ff57f142.js
│   │       ├── 40.bb76f148.js
│   │       ├── 41.000bfe72.js
│   │       ├── 42.026c4ae3.js
│   │       ├── 43.a64d3d9d.js
│   │       ├── 44.92abeb4c.js
│   │       ├── 45.5b266982.js
│   │       ├── 46.2308134c.js
│   │       ├── 47.bb79218f.js
│   │       ├── 48.1c9fc7d5.js
│   │       ├── 49.61ac7bc9.js
│   │       ├── 5.082bf8bb.js
│   │       ├── 50.1885cbd0.js
│   │       ├── 51.cd45fdff.js
│   │       ├── 52.e9466cf7.js
│   │       ├── 53.6937ae5b.js
│   │       ├── 54.eb2ead99.js
│   │       ├── 55.acc92e1e.js
│   │       ├── 56.c6f6eeff.js
│   │       ├── 57.48c68b3e.js
│   │       ├── 58.a2543ba2.js
│   │       ├── 59.8f479c38.js
│   │       ├── 6.a76c0e23.js
│   │       ├── 60.fc4f75b0.js
│   │       ├── 61.b1c46878.js
│   │       ├── 62.fff21d87.js
│   │       ├── 63.9d3d8477.js
│   │       ├── 64.010d135d.js
│   │       ├── 65.6cbce77c.js
│   │       ├── 66.fdfbb9d1.js
│   │       ├── 67.7715276d.js
│   │       ├── 68.3ef20b75.js
│   │       ├── 69.23899484.js
│   │       ├── 7.71d197a6.js
│   │       ├── 70.9e608dec.js
│   │       ├── 71.acaba3e2.js
│   │       ├── 72.fbae8ba4.js
│   │       ├── 73.d2cbdd12.js
│   │       ├── 74.a9217ec5.js
│   │       ├── 75.1d694460.js
│   │       ├── 76.3e60f4da.js
│   │       ├── 77.1589c405.js
│   │       ├── 8.fa989ad9.js
│   │       ├── 9.8106ef0a.js
│   │       └── app.e169f4c1.js
│   ├── index.html
│   ├── tencent13978746047597349090.txt
│   └── 专题/
│       ├── index.html
│       ├── 图片.html
│       ├── 性能优化.html
│       ├── 深入研究的知识点.html
│       ├── 百度.html
│       ├── 算法.html
│       ├── 网络.html
│       ├── 腾讯.html
│       └── 阿里巴巴.html
├── package.json
├── source/
│   ├── .vuepress/
│   │   ├── config.js
│   │   └── nav.js
│   ├── Android/
│   │   ├── ANR定位和修正.md
│   │   ├── AOP技术方案.md
│   │   ├── Apk打包流程.md
│   │   ├── ArrayMap对比HashMap.md
│   │   ├── Art Dalvik区别.md
│   │   ├── Binder原理.md
│   │   ├── ContentProvider-乐视.md
│   │   ├── Framework.md
│   │   ├── Glide源码解析.md
│   │   ├── Gradle.md
│   │   ├── Handler原理.md
│   │   ├── Kotlin.md
│   │   ├── LinearLayout对比RelativeLayout-百度.md
│   │   ├── README.md
│   │   ├── RecyclerView缓存原理.md
│   │   ├── SP原理及优化.md
│   │   ├── Service与Activity之间通信的几种方式.md
│   │   ├── Touch事件传递流程-小米.md
│   │   ├── Ubuntu编译安卓系统-百度.md
│   │   ├── dex,odex,oat,vdex,art文件结构.md
│   │   ├── fragment生命周期.md
│   │   ├── launchmode应用场景-百度-小米-乐视.md
│   │   ├── onSaveInstanceState原理.md
│   │   ├── view绘制流程-百度.md
│   │   ├── volley解析-美团-乐视.md
│   │   ├── 为什么不能使用Application Context显示 Dialog.md
│   │   ├── 什么情况导致oom-乐视-美团.md
│   │   ├── 什么情况导致内存泄漏-美团.md
│   │   ├── 动画框架实现原理.md
│   │   ├── 垃圾回收.md
│   │   ├── 屏幕刷新机制-腾讯.md
│   │   ├── 属性动画特性-乐视-小米.md
│   │   ├── 插件化.md
│   │   ├── 数据库.md
│   │   ├── 本地广播和全局广播有什么差别.md
│   │   ├── 架构范式.md
│   │   ├── 每个应用程序分配的内存大小是多少?-美团.md
│   │   ├── 注解处理器APT.md
│   │   ├── 渲染机制原理.md
│   │   └── 设计模式.md
│   ├── Java/
│   │   ├── ClassNotFoundException和NoClassDefFoundError的区别.md
│   │   ├── Exception 和 Error 有何区别?.md
│   │   ├── HashMap原理-美团.md
│   │   ├── JIT 编译器.md
│   │   ├── JavaBean HashCode怎么写.md
│   │   ├── LRUCache.md
│   │   ├── Wait、Sleep和Yield方法的区别.md
│   │   ├── hashmap和hashtable的区别-乐视-小米.md
│   │   ├── 内存模型.md
│   │   ├── 列举java的集合和继承关系-百度-美团.md
│   │   ├── 动态代理.md
│   │   ├── 多态.md
│   │   ├── 大文件排序.md
│   │   ├── 容器类之间的区别-乐视-美团.md
│   │   ├── 泛型.md
│   │   ├── 父类的静态方法能否被子类重写-猎豹.md
│   │   ├── 线程&&线程池原理-腾讯.md
│   │   ├── 虚拟机-百度-乐视.md
│   │   ├── 进程和线程的区别-猎豹-美团.md
│   │   └── 锁&&并发.md
│   ├── README.md
│   ├── java/
│   │   └── README.md
│   └── 专题/
│       ├── README.md
│       ├── 图片.md
│       ├── 性能优化.md
│       ├── 深入研究的知识点.md
│       ├── 百度.md
│       ├── 算法.md
│       ├── 网络.md
│       ├── 腾讯.md
│       └── 阿里巴巴.md
└── tencent13978746047597349090.txt
Download .txt
SYMBOL INDEX (695 symbols across 6 files)

FILE: .vuepress/dist/assets/js/app.3c9e1f27.js
  function e (line 1) | function e(e){for(var r,a,s=e[0],c=e[1],u=e[2],f=0,p=[];f<s.length;f++)a...
  function n (line 1) | function n(){for(var t,e=0;e<o.length;e++){for(var n=o[e],r=!0,s=1;s<n.l...
  function a (line 1) | function a(e){if(r[e])return r[e].exports;var n=r[e]={i:e,l:!1,exports:{...
  function r (line 1) | function r(t,e,n,r,i,o,a,s){var c,u="function"==typeof t?t.options:t;if(...
  function n (line 3) | function n(t,e,n){return t<e?e:t>n?n:t}
  function r (line 3) | function r(t){return 100*(-1+t)}
  function e (line 3) | function e(){var n=t.shift();n&&n(e)}
  function n (line 3) | function n(n){return n=function(t){return t.replace(/^-ms-/,"ms-").repla...
  function r (line 3) | function r(t,e,r){e=n(e),t.style[e]=r}
  function a (line 3) | function a(t,e){var n="string"==typeof t?t:u(t);return n.indexOf(" "+e+"...
  function s (line 3) | function s(t,e){var n=u(t),r=n+e;a(n,e)||(t.className=r.substring(1))}
  function c (line 3) | function c(t,e){var n,r=u(t);a(t,e)&&(n=r.replace(" "+e+" "," "),t.class...
  function u (line 3) | function u(t){return(" "+(t.className||"")+" ").replace(/\s+/gi," ")}
  function l (line 3) | function l(t){t&&t.parentNode&&t.parentNode.removeChild(t)}
  function m (line 3) | function m(t,e,r){var i,o,a,s,c,u,l=0,f=!1,p=!1,h=!0;if("function"!=type...
  function B (line 3) | function B(t){var e=typeof t;return!!t&&("object"==e||"function"==e)}
  function A (line 3) | function A(t){if("number"==typeof t)return t;if(function(t){return"symbo...
  function i (line 3) | function i(t){return void 0===t||null===t}
  function o (line 3) | function o(t){return void 0!==t&&null!==t}
  function a (line 3) | function a(t){return!0===t}
  function s (line 3) | function s(t){return"string"==typeof t||"number"==typeof t||"symbol"==ty...
  function c (line 3) | function c(t){return null!==t&&"object"==typeof t}
  function l (line 3) | function l(t){return"[object Object]"===u.call(t)}
  function f (line 3) | function f(t){return"[object RegExp]"===u.call(t)}
  function p (line 3) | function p(t){var e=parseFloat(String(t));return e>=0&&Math.floor(e)===e...
  function h (line 3) | function h(t){return null==t?"":"object"==typeof t?JSON.stringify(t,null...
  function d (line 3) | function d(t){var e=parseFloat(t);return isNaN(e)?t:e}
  function v (line 3) | function v(t,e){for(var n=Object.create(null),r=t.split(","),i=0;i<r.len...
  function m (line 3) | function m(t,e){if(t.length){var n=t.indexOf(e);if(n>-1)return t.splice(...
  function A (line 3) | function A(t,e){return B.call(t,e)}
  function y (line 3) | function y(t){var e=Object.create(null);return function(n){return e[n]||...
  function n (line 3) | function n(n){var r=arguments.length;return r?r>1?t.apply(e,arguments):t...
  function k (line 3) | function k(t,e){e=e||0;for(var n=t.length-e,r=new Array(n);n--;)r[n]=t[n...
  function $ (line 3) | function $(t,e){for(var n in e)t[n]=e[n];return t}
  function S (line 3) | function S(t){for(var e={},n=0;n<t.length;n++)t[n]&&$(e,t[n]);return e}
  function F (line 3) | function F(t,e,n){}
  function D (line 3) | function D(t,e){if(t===e)return!0;var n=c(t),r=c(e);if(!n||!r)return!n&&...
  function T (line 3) | function T(t,e){for(var n=0;n<t.length;n++)if(D(t[n],e))return n;return-1}
  function L (line 3) | function L(t){var e=!1;return function(){e||(e=!0,t.apply(this,arguments...
  function N (line 3) | function N(t){var e=(t+"").charCodeAt(0);return 36===e||95===e}
  function U (line 3) | function U(t,e,n,r){Object.defineProperty(t,e,{value:n,enumerable:!!r,wr...
  function it (line 3) | function it(t){return"function"==typeof t&&/native code/.test(t.toString...
  function t (line 3) | function t(){this.set=Object.create(null)}
  function ft (line 3) | function ft(t){ut.target&&lt.push(ut.target),ut.target=t}
  function pt (line 3) | function pt(){ut.target=lt.pop()}
  function Et (line 3) | function Et(t){return new ht(void 0,void 0,void 0,String(t))}
  function mt (line 3) | function mt(t){var e=new ht(t.tag,t.data,t.children,t.text,t.elm,t.conte...
  function bt (line 3) | function bt(t){gt=t}
  function _t (line 3) | function _t(t,e,n){t.__proto__=e}
  function Ct (line 3) | function Ct(t,e,n){for(var r=0,i=n.length;r<i;r++){var o=n[r];U(t,o,e[o])}}
  function xt (line 3) | function xt(t,e){var n;if(c(t)&&!(t instanceof ht))return A(t,"__ob__")&...
  function kt (line 3) | function kt(t,e,n,r,i){var o=new ut,a=Object.getOwnPropertyDescriptor(t,...
  function $t (line 3) | function $t(t,e,n){if(Array.isArray(t)&&p(e))return t.length=Math.max(t....
  function St (line 3) | function St(t,e){if(Array.isArray(t)&&p(e))t.splice(e,1);else{var n=t.__...
  function Ot (line 3) | function Ot(t,e){if(!e)return t;for(var n,r,i,o=Object.keys(e),a=0;a<o.l...
  function jt (line 3) | function jt(t,e,n){return n?function(){var r="function"==typeof e?e.call...
  function Dt (line 3) | function Dt(t,e){return e?t?t.concat(e):Array.isArray(e)?e:[e]:t}
  function Tt (line 3) | function Tt(t,e,n,r){var i=Object.create(t||null);return e?$(i,e):i}
  function Pt (line 3) | function Pt(t,e,n){"function"==typeof e&&(e=e.options),function(t,e){var...
  function It (line 3) | function It(t,e,n,r){if("string"==typeof n){var i=t[e];if(A(i,n))return ...
  function Mt (line 3) | function Mt(t,e,n,r){var i=e[t],o=!A(n,t),a=n[t],s=Ut(Boolean,i.type);if...
  function Rt (line 3) | function Rt(t){var e=t&&t.toString().match(/^\s*function (\w+)/);return ...
  function Nt (line 3) | function Nt(t,e){return Rt(t)===Rt(e)}
  function Ut (line 3) | function Ut(t,e){if(!Array.isArray(e))return Nt(e,t)?0:-1;for(var n=0,r=...
  function Ht (line 3) | function Ht(t,e,n){if(e)for(var r=e;r=r.$parent;){var i=r.$options.error...
  function qt (line 3) | function qt(t,e,n){if(R.errorHandler)try{return R.errorHandler.call(null...
  function Wt (line 3) | function Wt(t,e,n){if(!V&&!z||"undefined"==typeof console)throw t;consol...
  function Xt (line 3) | function Xt(){Kt=!1;var t=Gt.slice(0);Gt.length=0;for(var e=0;e<t.length...
  function te (line 3) | function te(t,e){var n;if(Gt.push(function(){if(t)try{t.call(e)}catch(t)...
  function ne (line 3) | function ne(t){!function t(e,n){var r,i;var o=Array.isArray(e);if(!o&&!c...
  function oe (line 3) | function oe(t){function e(){var t=arguments,n=e.fns;if(!Array.isArray(n)...
  function ae (line 3) | function ae(t,e,n,r,o){var a,s,c,u;for(a in t)s=t[a],c=e[a],u=ie(a),i(s)...
  function se (line 3) | function se(t,e,n){var r;t instanceof ht&&(t=t.data.hook||(t.data.hook={...
  function ce (line 3) | function ce(t,e,n,r,i){if(o(e)){if(A(e,n))return t[n]=e[n],i||delete e[n...
  function ue (line 3) | function ue(t){return s(t)?[Et(t)]:Array.isArray(t)?function t(e,n){var ...
  function le (line 3) | function le(t){return o(t)&&o(t.text)&&function(t){return!1===t}(t.isCom...
  function fe (line 3) | function fe(t,e){return(t.__esModule||at&&"Module"===t[Symbol.toStringTa...
  function pe (line 3) | function pe(t){return t.isComment&&t.asyncFactory}
  function he (line 3) | function he(t){if(Array.isArray(t))for(var e=0;e<t.length;e++){var n=t[e...
  function de (line 3) | function de(t,e,n){n?re.$once(t,e):re.$on(t,e)}
  function ve (line 3) | function ve(t,e){re.$off(t,e)}
  function Ee (line 3) | function Ee(t,e,n){re=t,ae(e,n||{},de,ve),re=void 0}
  function me (line 3) | function me(t,e){var n={};if(!t)return n;for(var r=0,i=t.length;r<i;r++)...
  function Be (line 3) | function Be(t){return t.isComment&&!t.asyncFactory||" "===t.text}
  function Ae (line 3) | function Ae(t,e){e=e||{};for(var n=0;n<t.length;n++)Array.isArray(t[n])?...
  function ge (line 3) | function ge(t){for(;t&&(t=t.$parent);)if(t._inactive)return!0;return!1}
  function be (line 3) | function be(t,e){if(e){if(t._directInactive=!1,ge(t))return}else if(t._d...
  function we (line 3) | function we(t,e){ft();var n=t.$options[e];if(n)for(var r=0,i=n.length;r<...
  function Fe (line 3) | function Fe(){var t,e;for($e=!0,_e.sort(function(t,e){return t.id-e.id})...
  function Te (line 3) | function Te(t,e,n){De.get=function(){return this[e][n]},De.set=function(...
  function Le (line 3) | function Le(t){t._watchers=[];var e=t.$options;e.props&&function(t,e){va...
  function Ie (line 3) | function Ie(t,e,n){var r=!nt();"function"==typeof n?(De.get=r?Me(e):n,De...
  function Me (line 3) | function Me(t){return function(){var e=this._computedWatchers&&this._com...
  function Re (line 3) | function Re(t,e,n,r){return l(n)&&(r=n,n=n.handler),"string"==typeof n&&...
  function Ne (line 3) | function Ne(t,e){if(t){for(var n=Object.create(null),r=at?Reflect.ownKey...
  function Ue (line 3) | function Ue(t,e){var n,r,i,a,s;if(Array.isArray(t)||"string"==typeof t)f...
  function He (line 3) | function He(t,e,n,r){var i,o=this.$scopedSlots[t];if(o)n=n||{},r&&(n=$($...
  function qe (line 3) | function qe(t){return It(this.$options,"filters",t)||j}
  function We (line 3) | function We(t,e){return Array.isArray(t)?-1===t.indexOf(e):t!==e}
  function Ve (line 3) | function Ve(t,e,n,r,i){var o=R.keyCodes[e]||n;return i&&r&&!R.keyCodes[e...
  function ze (line 3) | function ze(t,e,n,r,i){if(n)if(c(n)){var o;Array.isArray(n)&&(n=S(n));va...
  function Ge (line 3) | function Ge(t,e){var n=this._staticTrees||(this._staticTrees=[]),r=n[t];...
  function Ke (line 3) | function Ke(t,e,n){return Xe(t,"__once__"+e+(n?"_"+n:""),!0),t}
  function Xe (line 3) | function Xe(t,e,n){if(Array.isArray(t))for(var r=0;r<t.length;r++)t[r]&&...
  function Je (line 3) | function Je(t,e,n){t.isStatic=!0,t.key=e,t.isOnce=n}
  function Ye (line 3) | function Ye(t,e){if(e)if(l(e)){var n=t.on=t.on?$({},t.on):{};for(var r i...
  function Qe (line 3) | function Qe(t){t._o=Ke,t._n=d,t._s=h,t._l=Ue,t._t=He,t._q=D,t._i=T,t._m=...
  function Ze (line 3) | function Ze(t,e,n,i,o){var s,c=o.options;A(i,"_uid")?(s=Object.create(i)...
  function tn (line 3) | function tn(t,e,n,r){var i=mt(t);return i.fnContext=n,i.fnOptions=r,e.sl...
  function en (line 3) | function en(t,e){for(var n in e)t[b(n)]=e[n]}
  function on (line 3) | function on(t,e,n,s,u){if(!i(t)){var l=n.$options._base;if(c(t)&&(t=l.ex...
  function cn (line 3) | function cn(t,e,n,r,u,l){return(Array.isArray(n)||s(n))&&(u=r,r=n,n=void...
  function ln (line 3) | function ln(t){var e=t.options;if(t.super){var n=ln(t.super);if(n!==t.su...
  function fn (line 3) | function fn(t,e,n){if(Array.isArray(t)){var r=[];n=Array.isArray(n)?n:[n...
  function pn (line 3) | function pn(t){this._init(t)}
  function hn (line 3) | function hn(t){t.cid=0;var e=1;t.extend=function(t){t=t||{};var n=this,r...
  function dn (line 3) | function dn(t){return t&&(t.Ctor.options.name||t.tag)}
  function vn (line 3) | function vn(t,e){return Array.isArray(t)?t.indexOf(e)>-1:"string"==typeo...
  function En (line 3) | function En(t,e){var n=t.cache,r=t.keys,i=t._vnode;for(var o in n){var a...
  function mn (line 3) | function mn(t,e,n,r){var i=t[e];!i||r&&i.tag===r.tag||i.componentInstanc...
  function r (line 3) | function r(){n.$off(t,r),e.apply(n,arguments)}
  function $n (line 3) | function $n(t){for(var e=t.data,n=t,r=t;o(r.componentInstance);)(r=r.com...
  function Sn (line 3) | function Sn(t,e){return{staticClass:Fn(t.staticClass,e.staticClass),clas...
  function Fn (line 3) | function Fn(t,e){return t?e?t+" "+e:t:e||""}
  function On (line 3) | function On(t){return Array.isArray(t)?function(t){for(var e,n="",r=0,i=...
  function Nn (line 3) | function Nn(t,e){var n=t.data.ref;if(o(n)){var r=t.context,i=t.component...
  function qn (line 3) | function qn(t,e){return t.key===e.key&&(t.tag===e.tag&&t.isComment===e.i...
  function Wn (line 3) | function Wn(t,e,n){var r,i,a={};for(r=e;r<=n;++r)o(i=t[r].key)&&(a[i]=r)...
  function zn (line 3) | function zn(t,e){(t.data.directives||e.data.directives)&&function(t,e){v...
  function Kn (line 3) | function Kn(t,e){var n,r,i=Object.create(null);if(!t)return i;for(n=0;n<...
  function Xn (line 3) | function Xn(t){return t.rawName||t.name+"."+Object.keys(t.modifiers||{})...
  function Jn (line 3) | function Jn(t,e,n,r,i){var o=t.def&&t.def[e];if(o)try{o(n.elm,t,n,r,i)}c...
  function Qn (line 3) | function Qn(t,e){var n=e.componentOptions;if(!(o(n)&&!1===n.Ctor.options...
  function Zn (line 3) | function Zn(t,e,n){t.tagName.indexOf("-")>-1?tr(t,e,n):wn(e)?kn(n)?t.rem...
  function tr (line 3) | function tr(t,e,n){if(kn(n))t.removeAttribute(e);else{if(X&&!J&&"TEXTARE...
  function nr (line 3) | function nr(t,e){var n=e.elm,r=e.data,a=t.data;if(!(i(r.staticClass)&&i(...
  function sr (line 3) | function sr(t,e,n,r,i){e=function(t){return t._withTask||(t._withTask=fu...
  function cr (line 3) | function cr(t,e,n,r){(r||rr).removeEventListener(t,e._withTask||e,n)}
  function ur (line 3) | function ur(t,e){if(!i(t.data.on)||!i(e.data.on)){var n=e.data.on||{},r=...
  function fr (line 3) | function fr(t,e){if(!i(t.data.domProps)||!i(e.data.domProps)){var n,r,a=...
  function pr (line 3) | function pr(t,e){return!t.composing&&("OPTION"===t.tagName||function(t,e...
  function vr (line 3) | function vr(t){var e=Er(t.style);return t.staticStyle?$(t.staticStyle,e):e}
  function Er (line 3) | function Er(t){return Array.isArray(t)?S(t):"string"==typeof t?dr(t):t}
  function wr (line 3) | function wr(t,e){var n=e.data,r=t.data;if(!(i(n.staticStyle)&&i(n.style)...
  function Cr (line 3) | function Cr(t,e){if(e&&(e=e.trim()))if(t.classList)e.indexOf(" ")>-1?e.s...
  function xr (line 3) | function xr(t,e){if(e&&(e=e.trim()))if(t.classList)e.indexOf(" ")>-1?e.s...
  function kr (line 3) | function kr(t){if(t){if("object"==typeof t){var e={};return!1!==t.css&&$...
  function Ir (line 3) | function Ir(t){Pr(function(){Pr(t)})}
  function Mr (line 3) | function Mr(t,e){var n=t._transitionClasses||(t._transitionClasses=[]);n...
  function Rr (line 3) | function Rr(t,e){t._transitionClasses&&m(t._transitionClasses,e),xr(t,e)}
  function Nr (line 3) | function Nr(t,e,n){var r=Hr(t,e),i=r.type,o=r.timeout,a=r.propCount;if(!...
  function Hr (line 3) | function Hr(t,e){var n,r=window.getComputedStyle(t),i=r[jr+"Delay"].spli...
  function qr (line 3) | function qr(t,e){for(;t.length<e.length;)t=t.concat(t);return Math.max.a...
  function Wr (line 3) | function Wr(t){return 1e3*Number(t.slice(0,-1))}
  function Vr (line 3) | function Vr(t,e){var n=t.elm;o(n._leaveCb)&&(n._leaveCb.cancelled=!0,n._...
  function zr (line 3) | function zr(t,e){var n=t.elm;o(n._enterCb)&&(n._enterCb.cancelled=!0,n._...
  function Gr (line 3) | function Gr(t){return"number"==typeof t&&!isNaN(t)}
  function Kr (line 3) | function Kr(t){if(i(t))return!1;var e=t.fns;return o(e)?Kr(Array.isArray...
  function Xr (line 3) | function Xr(t,e){!0!==e.data.show&&Vr(e)}
  function l (line 3) | function l(t){var e=u.parentNode(t);o(e)&&u.removeChild(e,t)}
  function f (line 3) | function f(t,e,n,i,s,c,l){if(o(t.elm)&&o(c)&&(t=c[l]=mt(t)),t.isRootInse...
  function p (line 3) | function p(t,e){o(t.data.pendingInsert)&&(e.push.apply(e,t.data.pendingI...
  function h (line 3) | function h(t,e,n){o(t)&&(o(n)?n.parentNode===t&&u.insertBefore(t,e,n):u....
  function d (line 3) | function d(t,e,n){if(Array.isArray(e))for(var r=0;r<e.length;++r)f(e[r],...
  function E (line 3) | function E(t){for(;t.componentInstance;)t=t.componentInstance._vnode;ret...
  function m (line 3) | function m(t,n){for(var i=0;i<r.create.length;++i)r.create[i](Un,t);o(e=...
  function B (line 3) | function B(t){var e;if(o(e=t.fnScopeId))u.setStyleScope(t.elm,e);else fo...
  function A (line 3) | function A(t,e,n,r,i,o){for(;r<=i;++r)f(n[r],o,t,e,!1,n,r)}
  function y (line 3) | function y(t){var e,n,i=t.data;if(o(i))for(o(e=i.hook)&&o(e=e.destroy)&&...
  function g (line 3) | function g(t,e,n,r){for(;n<=r;++n){var i=e[n];o(i)&&(o(i.tag)?(b(i),y(i)...
  function b (line 3) | function b(t,e){if(o(e)||o(t.data)){var n,i=r.remove.length+1;for(o(e)?e...
  function w (line 3) | function w(t,e,n,r){for(var i=n;i<r;i++){var a=e[i];if(o(a)&&qn(t,a))ret...
  function _ (line 3) | function _(t,e,n,s){if(t!==e){var c=e.elm=t.elm;if(a(t.isAsyncPlaceholde...
  function C (line 3) | function C(t,e,n){if(a(n)&&o(t.parent))t.parent.data.pendingInsert=e;els...
  function k (line 3) | function k(t,e,n,r){var i,s=e.tag,c=e.data,u=e.children;if(r=r||c&&c.pre...
  function Qr (line 3) | function Qr(t,e,n){Zr(t,e,n),(X||Y)&&setTimeout(function(){Zr(t,e,n)},0)}
  function Zr (line 3) | function Zr(t,e,n){var r=e.value,i=t.multiple;if(!i||Array.isArray(r)){f...
  function ti (line 3) | function ti(t,e){return e.every(function(e){return!D(e,t)})}
  function ei (line 3) | function ei(t){return"_value"in t?t._value:t.value}
  function ni (line 3) | function ni(t){t.target.composing=!0}
  function ri (line 3) | function ri(t){t.target.composing&&(t.target.composing=!1,ii(t.target,"i...
  function ii (line 3) | function ii(t,e){var n=document.createEvent("HTMLEvents");n.initEvent(e,...
  function oi (line 3) | function oi(t){return!t.componentInstance||t.data&&t.data.transition?t:o...
  function ci (line 3) | function ci(t){var e=t&&t.componentOptions;return e&&e.Ctor.options.abst...
  function ui (line 3) | function ui(t){var e={},n=t.$options;for(var r in n.propsData)e[r]=t[r];...
  function li (line 3) | function li(t,e){if(/\d-keep-alive$/.test(e.tag))return t("keep-alive",{...
  function hi (line 3) | function hi(t){t.elm._moveCb&&t.elm._moveCb(),t.elm._enterCb&&t.elm._ent...
  function di (line 3) | function di(t){t.data.newPos=t.elm.getBoundingClientRect()}
  function vi (line 3) | function vi(t){var e=t.data.pos,n=t.data.newPos,r=e.left-n.left,i=e.top-...
  function Bi (line 8) | function Bi(t,e){0}
  function Ai (line 8) | function Ai(t){return Object.prototype.toString.call(t).indexOf("Error")...
  function xi (line 8) | function xi(t){var e={};return(t=t.trim().replace(/^(\?|#|&)/,""))?(t.sp...
  function ki (line 8) | function ki(t){var e=t?Object.keys(t).map(function(e){var n=t[e];if(void...
  function Si (line 8) | function Si(t,e,n,r){var i=r&&r.options.stringifyQuery,o=e.query||{};try...
  function Fi (line 8) | function Fi(t){if(Array.isArray(t))return t.map(Fi);if(t&&"object"==type...
  function ji (line 8) | function ji(t,e){var n=t.path,r=t.query;void 0===r&&(r={});var i=t.hash;...
  function Di (line 8) | function Di(t,e){return e===Oi?t===e:!!e&&(t.path&&e.path?t.path.replace...
  function Ti (line 8) | function Ti(t,e){if(void 0===t&&(t={}),void 0===e&&(e={}),!t||!e)return ...
  function Ri (line 8) | function Ri(t){if(!(t.metaKey||t.altKey||t.ctrlKey||t.shiftKey||t.defaul...
  function Ni (line 8) | function Ni(t){if(!Ni.installed||Li!==t){Ni.installed=!0,Li=t;var e=func...
  function Hi (line 8) | function Hi(t,e,n){var r=t.charAt(0);if("/"===r)return t;if("?"===r||"#"...
  function qi (line 8) | function qi(t){return t.replace(/\/\//g,"/")}
  function Yi (line 8) | function Yi(t,e){for(var n,r=[],i=0,o=0,a="",s=e&&e.delimiter||"/";null!...
  function Qi (line 8) | function Qi(t){return encodeURI(t).replace(/[\/?#]/g,function(t){return"...
  function Zi (line 8) | function Zi(t){return encodeURI(t).replace(/[?#]/g,function(t){return"%"...
  function to (line 8) | function to(t){for(var e=new Array(t.length),n=0;n<t.length;n++)"object"...
  function eo (line 8) | function eo(t){return t.replace(/([.+*?=^!:${}()[\]|\/\\])/g,"\\$1")}
  function no (line 8) | function no(t){return t.replace(/([=!:$\/()])/g,"\\$1")}
  function ro (line 8) | function ro(t,e){return t.keys=e,t}
  function io (line 8) | function io(t){return t.sensitive?"":"i"}
  function oo (line 8) | function oo(t,e,n){Wi(e)||(n=e||n,e=[]);for(var r=(n=n||{}).strict,i=!1!...
  function ao (line 8) | function ao(t,e,n){return Wi(e)||(n=e||n,e=[]),n=n||{},t instanceof RegE...
  function co (line 8) | function co(t,e,n){try{return(so[t]||(so[t]=Vi.compile(t)))(e||{},{prett...
  function uo (line 8) | function uo(t,e,n,r){var i=e||[],o=n||Object.create(null),a=r||Object.cr...
  function lo (line 8) | function lo(t,e,n,r){var i="string"==typeof t?{path:t}:t;if(i.name||i._n...
  function fo (line 8) | function fo(t,e){for(var n in e)t[n]=e[n];return t}
  function po (line 8) | function po(t,e){var n=uo(t),r=n.pathList,i=n.pathMap,o=n.nameMap;functi...
  function ho (line 8) | function ho(t,e,n){var r=e.match(t);if(!r)return!1;if(!n)return!0;for(va...
  function Eo (line 8) | function Eo(){window.history.replaceState({key:ko()},""),window.addEvent...
  function mo (line 8) | function mo(t,e,n,r){if(t.app){var i=t.options.scrollBehavior;i&&t.app.$...
  function Bo (line 8) | function Bo(){var t=ko();t&&(vo[t]={x:window.pageXOffset,y:window.pageYO...
  function Ao (line 8) | function Ao(t){return go(t.x)||go(t.y)}
  function yo (line 8) | function yo(t){return{x:go(t.x)?t.x:window.pageXOffset,y:go(t.y)?t.y:win...
  function go (line 8) | function go(t){return"number"==typeof t}
  function bo (line 8) | function bo(t,e){var n="object"==typeof t;if(n&&"string"==typeof t.selec...
  function xo (line 8) | function xo(){return _o.now().toFixed(3)}
  function ko (line 8) | function ko(){return Co}
  function $o (line 8) | function $o(t,e){Bo();var n=window.history;try{e?n.replaceState({key:Co}...
  function So (line 8) | function So(t){$o(t,!0)}
  function Fo (line 8) | function Fo(t,e,n){var r=function(i){i>=t.length?n():t[i]?e(t[i],functio...
  function Oo (line 8) | function Oo(t){return function(e,n,r){var i=!1,o=0,a=null;jo(t,function(...
  function jo (line 8) | function jo(t,e){return Do(t.map(function(t){return Object.keys(t.compon...
  function Do (line 8) | function Do(t){return Array.prototype.concat.apply([],t)}
  function Lo (line 8) | function Lo(t){var e=!1;return function(){for(var n=[],r=arguments.lengt...
  function Io (line 8) | function Io(t,e,n,r){var i=jo(t,function(t,r,i,o){var a=function(t,e){"f...
  function Mo (line 8) | function Mo(t,e){if(e)return function(){return t.apply(e,arguments)}}
  function e (line 8) | function e(e,n){var r=this;t.call(this,e,n);var i=e.options.scrollBehavi...
  function No (line 8) | function No(t){var e=window.location.pathname;return t&&0===e.indexOf(t)...
  function e (line 8) | function e(e,n,r){t.call(this,e,n),r&&function(t){var e=No(t);if(!/^\/#/...
  function Ho (line 8) | function Ho(){var t=qo();return"/"===t.charAt(0)||(zo("/"+t),!1)}
  function qo (line 8) | function qo(){var t=window.location.href,e=t.indexOf("#");return-1===e?"...
  function Wo (line 8) | function Wo(t){var e=window.location.href,n=e.indexOf("#");return(n>=0?e...
  function Vo (line 8) | function Vo(t){wo?$o(Wo(t)):window.location.hash=t}
  function zo (line 8) | function zo(t){wo?So(Wo(t)):window.location.replace(Wo(t))}
  function e (line 8) | function e(e,n){t.call(this,e,n),this.stack=[],this.index=-1}
  function Jo (line 8) | function Jo(t,e){return t.push(e),function(){var n=t.indexOf(e);n>-1&&t....
  function Qo (line 8) | function Qo(t){return function(t){if(Array.isArray(t)){for(var e=0,n=new...
  function Zo (line 8) | function Zo(t,e){var n;t.mixins||(t.mixins=[]),(n=t.mixins).push.apply(n...
  function sa (line 8) | function sa(t){return decodeURI(t).replace(ra,"").replace(ia,"")}
  function ca (line 8) | function ca(t){return aa.test(t)}
  function ua (line 8) | function ua(t){if(ca(t))return t;var e=t.match(ra),n=e?e[0]:"",r=sa(t);r...
  function la (line 8) | function la(t,e){var n=t.hash,r=function(t){var e=t.match(ra);if(e)retur...
  function fa (line 8) | function fa(t,e,n){n&&(e=function(t,e,n){var r=t.charAt(0);if("/"===r)re...
  function pa (line 8) | function pa(t,e,n,r){var i=n.pages,o=n.themeConfig,a=r&&o.locales&&o.loc...
  function ha (line 8) | function ha(t){var e;return(t=t.map(function(t){return Object.assign({},...
  function da (line 8) | function da(t){return Object.assign(t,{type:t.items&&t.items.length?"lin...
  function va (line 8) | function va(t){return/(\.html|\/)$/.test(t)?t:t+"/"}
  function Pa (line 8) | function Pa(t,e){return t.ownerDocument.defaultView.getComputedStyle(t,n...
  function Na (line 8) | function Na(t,e,n){var r=[];e.forEach(function(t){"group"===t.type?r.pus...
  function Wa (line 8) | function Wa(t,e,n,r){return t("router-link",{props:{to:e,activeClass:"",...
  function Va (line 8) | function Va(t,e,n,r,i){var o=arguments.length>5&&void 0!==arguments[5]?a...
  function ts (line 8) | function ts(t){return(ts="function"==typeof Symbol&&"symbol"==typeof Sym...
  function es (line 8) | function es(t){return(es="function"==typeof Symbol&&"symbol"===ts(Symbol...
  function ps (line 8) | function ps(t,e){if(e&&Qo(e).forEach(function(t){document.head.removeChi...

FILE: docs/assets/js/2.9b17f659.js
  function o (line 1) | function o(t){return decodeURI(t).replace(s,"").replace(i,"")}
  function l (line 1) | function l(t){return r.test(t)}
  function u (line 1) | function u(t){return/^mailto:/.test(t)}
  function c (line 1) | function c(t){return/^tel:/.test(t)}
  function h (line 1) | function h(t){if(l(t))return t;const e=t.match(s),n=e?e[0]:"",i=o(t);ret...
  function p (line 1) | function p(t,e){const n=decodeURIComponent(t.hash),i=function(t){const e...
  function d (line 1) | function d(t,e,n){if(l(e))return{type:"external",path:e};n&&(e=function(...
  function f (line 1) | function f(t,e,n,s){const{pages:i,themeConfig:a}=n,r=s&&a.locales&&a.loc...
  function g (line 1) | function g(t){const e=m(t.headers||[]);return[{type:"group",collapsable:...
  function m (line 1) | function m(t){let e;return(t=t.map(t=>Object.assign({},t))).forEach(t=>{...
  function b (line 1) | function b(t){return Object.assign(t,{type:t.items&&t.items.length?"link...
  method beforeCreate (line 1) | beforeCreate(){this.$options.components.SidebarLinks=n(257).default}
  function o (line 1) | function o(t,e,n,s,i){const a={props:{to:e,activeClass:"",exactActiveCla...
  function l (line 1) | function l(t,e,n,i,a,r=1){return!e||r>a?null:t("ul",{class:"sidebar-sub-...
  method render (line 1) | render(t,{parent:{$page:e,$site:n,$route:i,$themeConfig:a,$themeLocaleCo...
  function c (line 1) | function c(t,e){if("group"===e.type){const n=e.path&&Object(s.e)(t,e.pat...
  method data (line 1) | data(){return{openGroupIndex:this.initialOpenGroupIndex||0}}
  method $route (line 1) | $route(){this.refreshIndex()}
  method created (line 1) | created(){this.refreshIndex()}
  method refreshIndex (line 1) | refreshIndex(){const t=function(t,e){for(let n=0;n<e.length;n++){const s...
  method toggleGroup (line 1) | toggleGroup(t){this.openGroupIndex=t===this.openGroupIndex?-1:t}
  method isActive (line 1) | isActive(t){return Object(s.e)(this.$route,t.regularPath)}
  method setHeight (line 1) | setHeight(t){t.style.height=t.scrollHeight+"px"}
  method unsetHeight (line 1) | unsetHeight(t){t.style.height=""}
  method link (line 1) | link(){return Object(s.b)(this.item.link)}
  method exact (line 1) | exact(){return this.$site.locales?Object.keys(this.$site.locales).some(t...
  method isNonHttpURI (line 1) | isNonHttpURI(){return Object(s.g)(this.link)||Object(s.h)(this.link)}
  method isBlankTarget (line 1) | isBlankTarget(){return"_blank"===this.target}
  method isInternal (line 1) | isInternal(){return!Object(s.f)(this.link)&&!this.isBlankTarget}
  method target (line 1) | target(){return this.isNonHttpURI?null:this.item.target?this.item.target...
  method rel (line 1) | rel(){return this.isNonHttpURI||!1===this.item.rel?null:this.item.rel?th...
  method focusoutAction (line 1) | focusoutAction(){this.$emit("focusout")}
  method data (line 1) | data(){return this.$page.frontmatter}
  method actionLink (line 1) | actionLink(){return{link:this.data.actionLink,text:this.data.actionText}}
  method showSuggestions (line 1) | showSuggestions(){return this.focused&&this.suggestions&&this.suggestion...
  method suggestions (line 1) | suggestions(){const t=this.query.trim().toLowerCase();if(!t)return;const...
  method alignRight (line 1) | alignRight(){return(this.$site.themeConfig.nav||[]).length+(this.$site.r...
  method mounted (line 1) | mounted(){this.placeholder=this.$site.themeConfig.searchPlaceholder||"",...
  method beforeDestroy (line 1) | beforeDestroy(){document.removeEventListener("keydown",this.onHotkey)}
  method getPageLocalePath (line 1) | getPageLocalePath(t){for(const e in this.$site.locales||{})if("/"!==e&&0...
  method isSearchable (line 1) | isSearchable(t){let e=null;return null===e||(e=Array.isArray(e)?e:new Ar...
  method onHotkey (line 1) | onHotkey(t){t.srcElement===document.body&&["s","/"].includes(t.key)&&(th...
  method onUp (line 1) | onUp(){this.showSuggestions&&(this.focusIndex>0?this.focusIndex--:this.f...
  method onDown (line 1) | onDown(){this.showSuggestions&&(this.focusIndex<this.suggestions.length-...
  method go (line 1) | go(t){this.showSuggestions&&(this.$router.push(this.suggestions[t].path)...
  method focus (line 1) | focus(t){this.focusIndex=t}
  method unfocus (line 1) | unfocus(){this.focusIndex=-1}
  method dropdownAriaLabel (line 1) | dropdownAriaLabel(){return this.item.ariaLabel||this.item.text}
  method $route (line 1) | $route(){this.open=!1}
  method setOpen (line 1) | setOpen(t){this.open=t}
  method handleDropdown (line 1) | handleDropdown(){0===event.detail&&this.setOpen(!this.open)}
  method userNav (line 1) | userNav(){return this.$themeLocaleConfig.nav||this.$site.themeConfig.nav...
  method nav (line 1) | nav(){const{locales:t}=this.$site;if(t&&Object.keys(t).length>1){const e...
  method userLinks (line 1) | userLinks(){return(this.nav||[]).map(t=>Object.assign(Object(s.j)(t),{it...
  method repoLink (line 1) | repoLink(){const{repo:t}=this.$site.themeConfig;return t?/^https?:/.test...
  method repoLabel (line 1) | repoLabel(){if(!this.repoLink)return;if(this.$site.themeConfig.repoLabel...
  function C (line 1) | function C(t,e){return t.ownerDocument.defaultView.getComputedStyle(t,nu...
  method algolia (line 1) | algolia(){return this.$themeLocaleConfig.algolia||this.$site.themeConfig...
  method isAlgoliaSearch (line 1) | isAlgoliaSearch(){return this.algolia&&this.algolia.apiKey&&this.algolia...
  method mounted (line 1) | mounted(){const t=parseInt(C(this.$el,"paddingLeft"))+parseInt(C(this.$e...
  method lastUpdated (line 1) | lastUpdated(){return this.$page.lastUpdated}
  method lastUpdatedText (line 1) | lastUpdatedText(){return"string"==typeof this.$themeLocaleConfig.lastUpd...
  method editLink (line 1) | editLink(){const t=w()(this.$page.frontmatter.editLink)?this.$site.theme...
  method editLinkText (line 1) | editLinkText(){return this.$themeLocaleConfig.editLinkText||this.$site.t...
  method createEditLink (line 1) | createEditLink(t,e,n,i,a){if(/bitbucket.org/.test(e)){return e.replace(s...
  method prev (line 1) | prev(){return P(T.PREV,this)}
  method next (line 1) | next(){return P(T.NEXT,this)}
  function P (line 1) | function P(t,{$themeConfig:e,$page:n,$route:i,$site:a,sidebarItems:r}){c...
  function A (line 1) | function A(t,e,n){const s=[];!function t(e,n){for(let s=0,i=e.length;s<i...
  method shouldShowNavbar (line 1) | shouldShowNavbar(){const{themeConfig:t}=this.$site,{frontmatter:e}=this....
  method shouldShowSidebar (line 1) | shouldShowSidebar(){const{frontmatter:t}=this.$page;return!t.home&&!1!==...
  method sidebarItems (line 1) | sidebarItems(){return Object(s.l)(this.$page,this.$page.regularPath,this...
  method pageClasses (line 1) | pageClasses(){const t=this.$page.frontmatter.pageClass;return[{"no-navba...
  method mounted (line 1) | mounted(){this.$router.afterEach(()=>{this.isSidebarOpen=!1})}
  method toggleSidebar (line 1) | toggleSidebar(t){this.isSidebarOpen="boolean"==typeof t?t:!this.isSideba...
  method onTouchStart (line 1) | onTouchStart(t){this.touchStart={x:t.changedTouches[0].clientX,y:t.chang...
  method onTouchEnd (line 1) | onTouchEnd(t){const e=t.changedTouches[0].clientX-this.touchStart.x,n=t....

FILE: docs/assets/js/4.ff57f142.js
  method mounted (line 1) | mounted(){this.$parent&&this.$parent.loadTabs&&this.$parent.loadTabs()}

FILE: docs/assets/js/5.082bf8bb.js
  method activeCodeTabIndex (line 1) | activeCodeTabIndex(e){this.activateCodeTab(e)}
  method mounted (line 1) | mounted(){this.loadTabs()}
  method changeCodeTab (line 1) | changeCodeTab(e){this.activeCodeTabIndex=e}
  method loadTabs (line 1) | loadTabs(){this.codeTabs=(this.$slots.default||[]).filter(e=>Boolean(e.c...
  method activateCodeTab (line 1) | activateCodeTab(e){this.codeTabs.forEach(e=>{e.elm&&e.elm.classList.remo...

FILE: docs/assets/js/app.e169f4c1.js
  function e (line 1) | function e(e){for(var r,i,s=e[0],c=e[1],u=e[2],d=0,f=[];d<s.length;d++)i...
  function n (line 1) | function n(){for(var t,e=0;e<a.length;e++){for(var n=a[e],r=!0,s=1;s<n.l...
  function i (line 1) | function i(e){if(r[e])return r[e].exports;var n=r[e]={i:e,l:!1,exports:{...
  function r (line 1) | function r(t,e,n,r,o,a,i,s){var c,u="function"==typeof t?t.options:t;if(...
  function c (line 1) | function c(t){var e=-1,n=null==t?0:t.length;for(this.clear();++e<n;){var...
  function o (line 3) | function o(t,e,n){return t<e?e:t>n?n:t}
  function a (line 3) | function a(t){return 100*(-1+t)}
  function e (line 3) | function e(){var n=t.shift();n&&n(e)}
  function n (line 3) | function n(n){return n=n.replace(/^-ms-/,"ms-").replace(/-([\da-z])/gi,(...
  function r (line 3) | function r(t,e,r){e=n(e),t.style[e]=r}
  function c (line 3) | function c(t,e){return("string"==typeof t?t:d(t)).indexOf(" "+e+" ")>=0}
  function u (line 3) | function u(t,e){var n=d(t),r=n+e;c(n,e)||(t.className=r.substring(1))}
  function l (line 3) | function l(t,e){var n,r=d(t);c(t,e)&&(n=r.replace(" "+e+" "," "),t.class...
  function d (line 3) | function d(t){return(" "+(t.className||"")+" ").replace(/\s+/gi," ")}
  function f (line 3) | function f(t){t&&t.parentNode&&t.parentNode.removeChild(t)}
  function c (line 3) | function c(t){var e=-1,n=null==t?0:t.length;for(this.clear();++e<n;){var...
  function u (line 3) | function u(t){var e=this.__data__=new r(t);this.size=e.size}
  function i (line 3) | function i(t){var e=-1,n=null==t?0:t.length;for(this.__data__=new r;++e<...
  function h (line 10) | function h(t){var e=typeof t;return!!t&&("object"==e||"function"==e)}
  function E (line 10) | function E(t){if("number"==typeof t)return t;if(function(t){return"symbo...
  function A (line 10) | function A(e){var n=r,a=o;return r=o=void 0,u=e,i=t.apply(a,n)}
  function B (line 10) | function B(t){return u=t,s=setTimeout(g,e),l?A(t):i}
  function y (line 10) | function y(t){var n=t-c;return void 0===c||n>=e||n<0||v&&t-u>=a}
  function g (line 10) | function g(){var t=p();if(y(t))return b(t);s=setTimeout(g,function(t){va...
  function b (line 10) | function b(t){return s=void 0,m&&r?A(t):(r=o=void 0,i)}
  function _ (line 10) | function _(){var t=p(),n=y(t);if(r=arguments,o=this,c=t,n){if(void 0===s...
  function c (line 10) | function c(t){var e=-1,n=null==t?0:t.length;for(this.clear();++e<n;){var...
  function o (line 10) | function o(t,e){if("function"!=typeof t||null!=e&&"function"!=typeof e)t...
  function a (line 16) | function a(t){return null==t}
  function i (line 16) | function i(t){return null!=t}
  function s (line 16) | function s(t){return!0===t}
  function c (line 16) | function c(t){return"string"==typeof t||"number"==typeof t||"symbol"==ty...
  function u (line 16) | function u(t){return"function"==typeof t}
  function l (line 16) | function l(t){return null!==t&&"object"==typeof t}
  function f (line 16) | function f(t){return"[object Object]"===d.call(t)}
  function p (line 16) | function p(t){return"[object RegExp]"===d.call(t)}
  function h (line 16) | function h(t){var e=parseFloat(String(t));return e>=0&&Math.floor(e)===e...
  function E (line 16) | function E(t){return i(t)&&"function"==typeof t.then&&"function"==typeof...
  function v (line 16) | function v(t){return null==t?"":Array.isArray(t)||f(t)&&t.toString===d?J...
  function m (line 16) | function m(t){var e=parseFloat(t);return isNaN(e)?t:e}
  function A (line 16) | function A(t,e){for(var n=Object.create(null),r=t.split(","),o=0;o<r.len...
  function y (line 16) | function y(t,e){var n=t.length;if(n){if(e===t[n-1])return void(t.length=...
  function b (line 16) | function b(t,e){return g.call(t,e)}
  function _ (line 16) | function _(t){var e=Object.create(null);return function(n){return e[n]||...
  function n (line 16) | function n(n){var r=arguments.length;return r?r>1?t.apply(e,arguments):t...
  function P (line 16) | function P(t,e){e=e||0;for(var n=t.length-e,r=new Array(n);n--;)r[n]=t[n...
  function O (line 16) | function O(t,e){for(var n in e)t[n]=e[n];return t}
  function S (line 16) | function S(t){for(var e={},n=0;n<t.length;n++)t[n]&&O(e,t[n]);return e}
  function $ (line 16) | function $(t,e,n){}
  function L (line 16) | function L(t,e){if(t===e)return!0;var n=l(t),r=l(e);if(!n||!r)return!n&&...
  function U (line 16) | function U(t,e){for(var n=0;n<t.length;n++)if(L(t[n],e))return n;return-1}
  function J (line 16) | function J(t){var e=!1;return function(){e||(e=!0,t.apply(this,arguments...
  function R (line 16) | function R(t,e){return t===e?0===t&&1/t!=1/e:t==t||e==e}
  function z (line 16) | function z(t){var e=(t+"").charCodeAt(0);return 36===e||95===e}
  function V (line 16) | function V(t,e,n,r){Object.defineProperty(t,e,{value:n,enumerable:!!r,wr...
  function st (line 16) | function st(t){return"function"==typeof t&&/native code/.test(t.toString...
  function t (line 16) | function t(){this.set=Object.create(null)}
  function dt (line 16) | function dt(t){void 0===t&&(t=null),t||lt&&lt._scope.off(),lt=t,t&&t._sc...
  function t (line 16) | function t(t,e,n,r,o,a,i,s){this.tag=t,this.data=e,this.children=n,this....
  function ht (line 16) | function ht(t){return new ft(void 0,void 0,void 0,String(t))}
  function Et (line 16) | function Et(t){var e=new ft(t.tag,t.data,t.children&&t.children.slice(),...
  function t (line 16) | function t(){this._pending=!1,this.id=vt++,this.subs=[]}
  function yt (line 16) | function yt(t){Bt.push(t),At.target=t}
  function gt (line 16) | function gt(){Bt.pop(),At.target=Bt[Bt.length-1]}
  function Ft (line 16) | function Ft(t){wt=t}
  function t (line 16) | function t(t,e,n){if(void 0===e&&(e=!1),void 0===n&&(n=!1),this.value=t,...
  function Pt (line 16) | function Pt(t,e,n){return t&&b(t,"__ob__")&&t.__ob__ instanceof Tt?t.__o...
  function Ot (line 16) | function Ot(t,e,n,r,a,i){var s=new At,c=Object.getOwnPropertyDescriptor(...
  function St (line 16) | function St(t,e,n){if(!Ut(t)){var r=t.__ob__;return o(t)&&h(e)?(t.length...
  function $t (line 16) | function $t(t,e){if(o(t)&&h(e))t.splice(e,1);else{var n=t.__ob__;t._isVu...
  function jt (line 16) | function jt(t){for(var e=void 0,n=0,r=t.length;n<r;n++)(e=t[n])&&e.__ob_...
  function Dt (line 16) | function Dt(t){return Lt(t,!0),V(t,"__v_isShallow",!0),t}
  function Lt (line 16) | function Lt(t,e){if(!Ut(t)){Pt(t,e,at());0}}
  function Ut (line 16) | function Ut(t){return!(!t||!t.__v_isReadonly)}
  function Jt (line 16) | function Jt(t){return!(!t||!0!==t.__v_isRef)}
  function Rt (line 16) | function Rt(t,e,n){Object.defineProperty(t,n,{enumerable:!0,configurable...
  function t (line 16) | function t(t){void 0===t&&(t=!1),this.detached=t,this.active=!0,this.eff...
  function Nt (line 16) | function Nt(t){var e=t._provided,n=t.$parent&&t.$parent._provided;return...
  function zt (line 16) | function zt(t,e){function n(){var t=n.fns;if(!o(t))return we(t,null,argu...
  function Vt (line 16) | function Vt(t,e,n,r,o,i){var c,u,l,d;for(c in t)u=t[c],l=e[c],d=Ht(c),a(...
  function qt (line 16) | function qt(t,e,n){var r;t instanceof ft&&(t=t.data.hook||(t.data.hook={...
  function Wt (line 16) | function Wt(t,e,n,r,o){if(i(e)){if(b(e,n))return t[n]=e[n],o||delete e[n...
  function Gt (line 16) | function Gt(t){return c(t)?[ht(t)]:o(t)?function t(e,n){var r,u,l,d,f=[]...
  function Kt (line 16) | function Kt(t){return i(t)&&i(t.text)&&!1===t.isComment}
  function Yt (line 16) | function Yt(t,e){var n,r,a,s,c=null;if(o(t)||"string"==typeof t)for(c=ne...
  function Xt (line 16) | function Xt(t,e,n,r){var o,a=this.$scopedSlots[t];a?(n=n||{},r&&(n=O(O({...
  function Qt (line 16) | function Qt(t){return Pn(this.$options,"filters",t,!0)||D}
  function Zt (line 16) | function Zt(t,e){return o(t)?-1===t.indexOf(e):t!==e}
  function te (line 16) | function te(t,e,n,r,o){var a=N.keyCodes[e]||n;return o&&r&&!N.keyCodes[e...
  function ee (line 16) | function ee(t,e,n,r,a){if(n)if(l(n)){o(n)&&(n=S(n));var i=void 0,s=funct...
  function ne (line 16) | function ne(t,e){var n=this._staticTrees||(this._staticTrees=[]),r=n[t];...
  function re (line 16) | function re(t,e,n){return oe(t,"__once__".concat(e).concat(n?"_".concat(...
  function oe (line 16) | function oe(t,e,n){if(o(t))for(var r=0;r<t.length;r++)t[r]&&"string"!=ty...
  function ae (line 16) | function ae(t,e,n){t.isStatic=!0,t.key=e,t.isOnce=n}
  function ie (line 16) | function ie(t,e){if(e)if(f(e)){var n=t.on=t.on?O({},t.on):{};for(var r i...
  function se (line 16) | function se(t,e,n,r){e=e||{$stable:!n};for(var a=0;a<t.length;a++){var i...
  function ce (line 16) | function ce(t,e){for(var n=0;n<e.length;n+=2){var r=e[n];"string"==typeo...
  function ue (line 16) | function ue(t,e){return"string"==typeof t?e+t:t}
  function le (line 16) | function le(t){t._o=re,t._n=m,t._s=v,t._l=Yt,t._t=Xt,t._q=L,t._i=U,t._m=...
  function de (line 16) | function de(t,e){if(!t||!t.length)return{};for(var n={},r=0,o=t.length;r...
  function fe (line 16) | function fe(t){return t.isComment&&!t.asyncFactory||" "===t.text}
  function pe (line 16) | function pe(t){return t.isComment&&t.asyncFactory}
  function he (line 16) | function he(t,e,n,o){var a,i=Object.keys(n).length>0,s=e?!!e.$stable:!i,...
  function Ee (line 16) | function Ee(t,e,n,r){var a=function(){var e=lt;dt(t);var n=arguments.len...
  function ve (line 16) | function ve(t,e){return function(){return t[e]}}
  function me (line 16) | function me(t){return{get attrs(){if(!t._attrsProxy){var e=t._attrsProxy...
  function Ae (line 16) | function Ae(t,e,n,r,o){var a=!1;for(var i in e)i in t?e[i]!==n[i]&&(a=!0...
  function Be (line 16) | function Be(t,e,n,r){Object.defineProperty(t,e,{enumerable:!0,configurab...
  function ye (line 16) | function ye(t,e){for(var n in e)t[n]=e[n];for(var n in t)n in e||delete ...
  function be (line 16) | function be(t,e){return(t.__esModule||ut&&"Module"===t[Symbol.toStringTa...
  function _e (line 16) | function _e(t){if(o(t))for(var e=0;e<t.length;e++){var n=t[e];if(i(n)&&(...
  function Ce (line 16) | function Ce(t,e,n,r,d,f){return(o(n)||c(n))&&(d=r,r=n,n=void 0),s(f)&&(d...
  function xe (line 16) | function xe(t,e,n){yt();try{if(e)for(var r=e;r=r.$parent;){var o=r.$opti...
  function we (line 16) | function we(t,e,n,r,o){var a;try{(a=n?t.apply(e,n):t.call(e))&&!a._isVue...
  function Fe (line 16) | function Fe(t,e,n){if(N.errorHandler)try{return N.errorHandler.call(null...
  function ke (line 16) | function ke(t,e,n){if(!G||"undefined"==typeof console)throw t;console.er...
  function $e (line 16) | function $e(){Se=!1;var t=Oe.slice(0);Oe.length=0;for(var e=0;e<t.length...
  function Je (line 16) | function Je(t,e){var n;if(Oe.push((function(){if(t)try{t.call(e)}catch(t...
  function Re (line 16) | function Re(t){return function(e,n){if(void 0===n&&(n=lt),n)return funct...
  function Ie (line 16) | function Ie(t){return function t(e,n){var r,a,i=o(e);if(!i&&!l(e)||e.__v...
  function t (line 16) | function t(t,e,n,r,o){var a,i;a=this,void 0===(i=Mt&&!Mt._vm?Mt:t?t._sco...
  function Ve (line 16) | function Ve(t,e){Ne.$on(t,e)}
  function qe (line 16) | function qe(t,e){Ne.$off(t,e)}
  function We (line 16) | function We(t,e){var n=Ne;return function r(){var o=e.apply(null,argumen...
  function Ge (line 16) | function Ge(t,e,n){Ne=t,Vt(e,n||{},Ve,qe,We,t),Ne=void 0}
  function Ye (line 16) | function Ye(t){var e=Ke;return Ke=t,function(){Ke=e}}
  function Xe (line 16) | function Xe(t){for(;t&&(t=t.$parent);)if(t._inactive)return!0;return!1}
  function Qe (line 16) | function Qe(t,e){if(e){if(t._directInactive=!1,Xe(t))return}else if(t._d...
  function Ze (line 16) | function Ze(t,e,n,r){void 0===r&&(r=!0),yt();var o=lt;r&&dt(t);var a=t.$...
  function dn (line 16) | function dn(){var t,e;for(sn=cn(),on=!0,tn.sort(ln),an=0;an<tn.length;an...
  function fn (line 16) | function fn(t){var e=t.id;if(null==nn[e]&&(t!==At.target||!t.noRecurse))...
  function pn (line 16) | function pn(t,e){if(t){for(var n=Object.create(null),r=ut?Reflect.ownKey...
  function hn (line 16) | function hn(t,e,n,a,i){var c,u=this,l=i.options;b(a,"_uid")?(c=Object.cr...
  function En (line 16) | function En(t,e,n,r,o){var a=Et(t);return a.fnContext=n,a.fnOptions=r,e....
  function vn (line 16) | function vn(t,e){for(var n in e)t[x(n)]=e[n]}
  function mn (line 16) | function mn(t){return t.name||t.__name||t._componentTag}
  function yn (line 16) | function yn(t,e,n,c,u){if(!a(t)){var d=n.$options._base;if(l(t)&&(t=d.ex...
  function gn (line 16) | function gn(t,e){var n=function(n,r){t(n,r),e(n,r)};return n._merged=!0,n}
  function Cn (line 16) | function Cn(t,e,n){if(void 0===n&&(n=!0),!e)return t;for(var r,o,a,i=ut?...
  function xn (line 16) | function xn(t,e,n){return n?function(){var r=u(e)?e.call(n,n):e,o=u(t)?t...
  function wn (line 16) | function wn(t,e){var n=e?t?t.concat(e):o(e)?e:[e]:t;return n?function(t)...
  function Fn (line 16) | function Fn(t,e,n,r){var o=Object.create(t||null);return e?O(o,e):o}
  function Tn (line 16) | function Tn(t,e,n){if(u(e)&&(e=e.options),function(t,e){var n=t.props;if...
  function Pn (line 16) | function Pn(t,e,n,r){if("string"==typeof n){var o=t[e];if(b(o,n))return ...
  function On (line 16) | function On(t,e,n,r){var o=e[t],a=!b(n,t),i=n[t],s=Dn(Boolean,o.type);if...
  function $n (line 16) | function $n(t){var e=t&&t.toString().match(Sn);return e?e[1]:""}
  function jn (line 16) | function jn(t,e){return $n(t)===$n(e)}
  function Dn (line 16) | function Dn(t,e){if(!o(e))return jn(e,t)?0:-1;for(var n=0,r=e.length;n<r...
  function Un (line 16) | function Un(t,e,n){Ln.get=function(){return this[e][n]},Ln.set=function(...
  function Jn (line 16) | function Jn(t){var e=t.$options;if(e.props&&function(t,e){var n=t.$optio...
  function Mn (line 16) | function Mn(t,e,n){var r=!at();u(n)?(Ln.get=r?In(e):Nn(n),Ln.set=$):(Ln....
  function In (line 16) | function In(t){return function(){var e=this._computedWatchers&&this._com...
  function Nn (line 16) | function Nn(t){return function(){return t.call(this,this)}}
  function Hn (line 16) | function Hn(t,e,n,r){return f(n)&&(r=n,n=n.handler),"string"==typeof n&&...
  function Vn (line 16) | function Vn(t){var e=t.options;if(t.super){var n=Vn(t.super);if(n!==t.su...
  function qn (line 16) | function qn(t){this._init(t)}
  function Wn (line 16) | function Wn(t){t.cid=0;var e=1;t.extend=function(t){t=t||{};var n=this,r...
  function Gn (line 16) | function Gn(t){return t&&(mn(t.Ctor.options)||t.tag)}
  function Kn (line 16) | function Kn(t,e){return o(t)?t.indexOf(e)>-1:"string"==typeof t?t.split(...
  function Yn (line 16) | function Yn(t,e){var n=t.cache,r=t.keys,o=t._vnode;for(var a in n){var i...
  function Xn (line 16) | function Xn(t,e,n,r){var o=t[e];!o||r&&o.tag===r.tag||o.componentInstanc...
  function r (line 16) | function r(){n.$off(t,r),e.apply(n,arguments)}
  function ur (line 16) | function ur(t){for(var e=t.data,n=t,r=t;i(r.componentInstance);)(r=r.com...
  function lr (line 16) | function lr(t,e){return{staticClass:dr(t.staticClass,e.staticClass),clas...
  function dr (line 16) | function dr(t,e){return t?e?t+" "+e:t:e||""}
  function fr (line 16) | function fr(t){return Array.isArray(t)?function(t){for(var e,n="",r=0,o=...
  function gr (line 16) | function gr(t,e){var n=t.data.ref;if(i(n)){var r=t.context,a=t.component...
  function br (line 16) | function br(t,e,n){var r=t._setupState;r&&b(r,e)&&(Jt(r[e])?r[e].value=n...
  function xr (line 16) | function xr(t,e){return t.key===e.key&&t.asyncFactory===e.asyncFactory&&...
  function wr (line 16) | function wr(t,e,n){var r,o,a={};for(r=e;r<=n;++r)i(o=t[r].key)&&(a[o]=r)...
  function kr (line 16) | function kr(t,e){(t.data.directives||e.data.directives)&&function(t,e){v...
  function Pr (line 16) | function Pr(t,e){var n,r,o=Object.create(null);if(!t)return o;for(n=0;n<...
  function Or (line 16) | function Or(t){return t.rawName||"".concat(t.name,".").concat(Object.key...
  function Sr (line 16) | function Sr(t,e,n,r,o){var a=t.def&&t.def[e];if(a)try{a(n.elm,t,n,r,o)}c...
  function jr (line 16) | function jr(t,e){var n=e.componentOptions;if(!(i(n)&&!1===n.Ctor.options...
  function Dr (line 16) | function Dr(t,e,n,r){r||t.tagName.indexOf("-")>-1?Lr(t,e,n):or(e)?cr(n)?...
  function Lr (line 16) | function Lr(t,e,n){if(cr(n))t.removeAttribute(e);else{if(Y&&!X&&"TEXTARE...
  function Jr (line 16) | function Jr(t,e){var n=e.elm,r=e.data,o=t.data;if(!(a(r.staticClass)&&a(...
  function Ir (line 16) | function Ir(t,e,n){var r=Rr;return function o(){var a=e.apply(null,argum...
  function Hr (line 16) | function Hr(t,e,n,r){if(Nr){var o=sn,a=e;e=a._wrapper=function(t){if(t.t...
  function zr (line 16) | function zr(t,e,n,r){(r||Rr).removeEventListener(t,e._wrapper||e,n)}
  function Vr (line 16) | function Vr(t,e){if(!a(t.data.on)||!a(e.data.on)){var n=e.data.on||{},r=...
  function Gr (line 16) | function Gr(t,e){if(!a(t.data.domProps)||!a(e.data.domProps)){var n,r,o=...
  function Kr (line 16) | function Kr(t,e){return!t.composing&&("OPTION"===t.tagName||function(t,e...
  function Qr (line 16) | function Qr(t){var e=Zr(t.style);return t.staticStyle?O(t.staticStyle,e):e}
  function Zr (line 16) | function Zr(t){return Array.isArray(t)?S(t):"string"==typeof t?Xr(t):t}
  function io (line 16) | function io(t,e){var n=e.data,r=t.data;if(!(a(n.staticStyle)&&a(n.style)...
  function uo (line 16) | function uo(t,e){if(e&&(e=e.trim()))if(t.classList)e.indexOf(" ")>-1?e.s...
  function lo (line 16) | function lo(t,e){if(e&&(e=e.trim()))if(t.classList)e.indexOf(" ")>-1?e.s...
  function fo (line 16) | function fo(t){if(t){if("object"==typeof t){var e={};return!1!==t.css&&O...
  function yo (line 16) | function yo(t){Bo((function(){Bo(t)}))}
  function go (line 16) | function go(t,e){var n=t._transitionClasses||(t._transitionClasses=[]);n...
  function bo (line 16) | function bo(t,e){t._transitionClasses&&y(t._transitionClasses,e),lo(t,e)}
  function _o (line 16) | function _o(t,e,n){var r=xo(t,e),o=r.type,a=r.timeout,i=r.propCount;if(!...
  function xo (line 16) | function xo(t,e){var n,r=window.getComputedStyle(t),o=(r[Eo+"Delay"]||""...
  function wo (line 16) | function wo(t,e){for(;t.length<e.length;)t=t.concat(t);return Math.max.a...
  function Fo (line 16) | function Fo(t){return 1e3*Number(t.slice(0,-1).replace(",","."))}
  function ko (line 16) | function ko(t,e){var n=t.elm;i(n._leaveCb)&&(n._leaveCb.cancelled=!0,n._...
  function To (line 16) | function To(t,e){var n=t.elm;i(n._enterCb)&&(n._enterCb.cancelled=!0,n._...
  function Po (line 16) | function Po(t){return"number"==typeof t&&!isNaN(t)}
  function Oo (line 16) | function Oo(t){if(a(t))return!1;var e=t.fns;return i(e)?Oo(Array.isArray...
  function So (line 16) | function So(t,e){!0!==e.data.show&&ko(e)}
  function d (line 16) | function d(t){var e=l.parentNode(t);i(e)&&l.removeChild(e,t)}
  function f (line 16) | function f(t,e,n,o,a,c,u){if(i(t.elm)&&i(c)&&(t=c[u]=Et(t)),t.isRootInse...
  function p (line 16) | function p(t,e){i(t.data.pendingInsert)&&(e.push.apply(e,t.data.pendingI...
  function h (line 16) | function h(t,e,n){i(t)&&(i(n)?l.parentNode(n)===t&&l.insertBefore(t,e,n)...
  function E (line 16) | function E(t,e,n){if(o(e)){0;for(var r=0;r<e.length;++r)f(e[r],n,t.elm,n...
  function v (line 16) | function v(t){for(;t.componentInstance;)t=t.componentInstance._vnode;ret...
  function m (line 16) | function m(t,n){for(var o=0;o<r.create.length;++o)r.create[o](_r,t);i(e=...
  function B (line 16) | function B(t){var e;if(i(e=t.fnScopeId))l.setStyleScope(t.elm,e);else fo...
  function y (line 16) | function y(t,e,n,r,o,a){for(;r<=o;++r)f(n[r],a,t,e,!1,n,r)}
  function g (line 16) | function g(t){var e,n,o=t.data;if(i(o))for(i(e=o.hook)&&i(e=e.destroy)&&...
  function b (line 16) | function b(t,e,n){for(;e<=n;++e){var r=t[e];i(r)&&(i(r.tag)?(_(r),g(r)):...
  function _ (line 16) | function _(t,e){if(i(e)||i(t.data)){var n,o=r.remove.length+1;for(i(e)?e...
  function C (line 16) | function C(t,e,n,r){for(var o=n;o<r;o++){var a=e[o];if(i(a)&&xr(t,a))ret...
  function x (line 16) | function x(t,e,n,o,c,u){if(t!==e){i(e.elm)&&i(o)&&(e=o[c]=Et(e));var d=e...
  function w (line 16) | function w(t,e,n){if(s(n)&&i(t.parent))t.parent.data.pendingInsert=e;els...
  function k (line 16) | function k(t,e,n,r){var o,a=e.tag,c=e.data,u=e.children;if(r=r||c&&c.pre...
  function Do (line 16) | function Do(t,e,n){Lo(t,e,n),(Y||Q)&&setTimeout((function(){Lo(t,e,n)}),0)}
  function Lo (line 16) | function Lo(t,e,n){var r=e.value,o=t.multiple;if(!o||Array.isArray(r)){f...
  function Uo (line 16) | function Uo(t,e){return e.every((function(e){return!L(e,t)}))}
  function Jo (line 16) | function Jo(t){return"_value"in t?t._value:t.value}
  function Ro (line 16) | function Ro(t){t.target.composing=!0}
  function Mo (line 16) | function Mo(t){t.target.composing&&(t.target.composing=!1,Io(t.target,"i...
  function Io (line 16) | function Io(t,e){var n=document.createEvent("HTMLEvents");n.initEvent(e,...
  function No (line 16) | function No(t){return!t.componentInstance||t.data&&t.data.transition?t:N...
  function Vo (line 16) | function Vo(t){var e=t&&t.componentOptions;return e&&e.Ctor.options.abst...
  function qo (line 16) | function qo(t){var e={},n=t.$options;for(var r in n.propsData)e[r]=t[r];...
  function Wo (line 16) | function Wo(t,e){if(/\d-keep-alive$/.test(e.tag))return t("keep-alive",{...
  function Qo (line 16) | function Qo(t){t.elm._moveCb&&t.elm._moveCb(),t.elm._enterCb&&t.elm._ent...
  function Zo (line 16) | function Zo(t){t.data.newPos=t.elm.getBoundingClientRect()}
  function ta (line 16) | function ta(t){var e=t.data.pos,n=t.data.newPos,r=e.left-n.left,o=e.top-...
  function na (line 16) | function na(t,e){for(var n in e)t[n]=e[n];return t}
  function sa (line 16) | function sa(t){try{return decodeURIComponent(t)}catch(t){0}return t}
  function ua (line 16) | function ua(t){var e={};return(t=t.trim().replace(/^(\?|#|&)/,""))?(t.sp...
  function la (line 16) | function la(t){var e=t?Object.keys(t).map((function(e){var n=t[e];if(voi...
  function fa (line 16) | function fa(t,e,n,r){var o=r&&r.options.stringifyQuery,a=e.query||{};try...
  function pa (line 16) | function pa(t){if(Array.isArray(t))return t.map(pa);if(t&&"object"==type...
  function Ea (line 16) | function Ea(t){for(var e=[];t;)e.unshift(t),t=t.parent;return e}
  function va (line 16) | function va(t,e){var n=t.path,r=t.query;void 0===r&&(r={});var o=t.hash;...
  function ma (line 16) | function ma(t,e,n){return e===ha?t===e:!!e&&(t.path&&e.path?t.path.repla...
  function Aa (line 16) | function Aa(t,e){if(void 0===t&&(t={}),void 0===e&&(e={}),!t||!e)return ...
  function Ba (line 16) | function Ba(t){for(var e=0;e<t.matched.length;e++){var n=t.matched[e];fo...
  function ga (line 16) | function ga(t,e,n,r){var o=e.props=function(t,e){switch(typeof e){case"u...
  function ba (line 16) | function ba(t,e,n){var r=t.charAt(0);if("/"===r)return t;if("?"===r||"#"...
  function _a (line 16) | function _a(t){return t.replace(/\/(?:\s*\/)+/g,"/")}
  function Oa (line 16) | function Oa(t,e){for(var n,r=[],o=0,a=0,i="",s=e&&e.delimiter||"/";null!...
  function Sa (line 16) | function Sa(t){return encodeURI(t).replace(/[\/?#]/g,(function(t){return...
  function $a (line 16) | function $a(t,e){for(var n=new Array(t.length),r=0;r<t.length;r++)"objec...
  function ja (line 16) | function ja(t){return t.replace(/([.+*?=^!:${}()[\]|\/\\])/g,"\\$1")}
  function Da (line 16) | function Da(t){return t.replace(/([=!:$\/()])/g,"\\$1")}
  function La (line 16) | function La(t,e){return t.keys=e,t}
  function Ua (line 16) | function Ua(t){return t&&t.sensitive?"":"i"}
  function Ja (line 16) | function Ja(t,e,n){Ca(e)||(n=e||n,e=[]);for(var r=(n=n||{}).strict,o=!1!...
  function Ra (line 16) | function Ra(t,e,n){return Ca(e)||(n=e||n,e=[]),n=n||{},t instanceof RegE...
  function Ia (line 16) | function Ia(t,e,n){e=e||{};try{var r=Ma[t]||(Ma[t]=xa.compile(t));return...
  function Na (line 16) | function Na(t,e,n,r){var o="string"==typeof t?{path:t}:t;if(o._normalize...
  function qa (line 16) | function qa(t){if(!(t.metaKey||t.altKey||t.ctrlKey||t.shiftKey||t.defaul...
  function Ga (line 16) | function Ga(t,e,n,r,o){var a=e||[],i=n||Object.create(null),s=r||Object....
  function Ka (line 16) | function Ka(t,e){return xa(t,[],e)}
  function Ya (line 16) | function Ya(t,e){var n=Ga(t),r=n.pathList,o=n.pathMap,a=n.nameMap;functi...
  function Xa (line 16) | function Xa(t,e,n){var r=e.match(t);if(!r)return!1;if(!n)return!0;for(va...
  function Za (line 16) | function Za(){return Qa.now().toFixed(3)}
  function ei (line 16) | function ei(){return ti}
  function ni (line 16) | function ni(t){return ti=t}
  function oi (line 16) | function oi(){"scrollRestoration"in window.history&&(window.history.scro...
  function ai (line 16) | function ai(t,e,n,r){if(t.app){var o=t.options.scrollBehavior;o&&t.app.$...
  function ii (line 16) | function ii(){var t=ei();t&&(ri[t]={x:window.pageXOffset,y:window.pageYO...
  function si (line 16) | function si(t){ii(),t.state&&t.state.key&&ni(t.state.key)}
  function ci (line 16) | function ci(t){return li(t.x)||li(t.y)}
  function ui (line 16) | function ui(t){return{x:li(t.x)?t.x:window.pageXOffset,y:li(t.y)?t.y:win...
  function li (line 16) | function li(t){return"number"==typeof t}
  function fi (line 16) | function fi(t,e){var n,r="object"==typeof t;if(r&&"string"==typeof t.sel...
  function Ei (line 16) | function Ei(t,e){ii();var n=window.history;try{if(e){var r=na({},n.state...
  function vi (line 16) | function vi(t){Ei(t,!0)}
  function Ai (line 16) | function Ai(t,e){return yi(t,e,mi.redirected,'Redirected when going from...
  function Bi (line 16) | function Bi(t,e){return yi(t,e,mi.cancelled,'Navigation cancelled from "...
  function yi (line 16) | function yi(t,e,n,r){var o=new Error(r);return o._isRouter=!0,o.from=t,o...
  function bi (line 16) | function bi(t){return Object.prototype.toString.call(t).indexOf("Error")...
  function _i (line 16) | function _i(t,e){return bi(t)&&t._isRouter&&(null==e||t.type===e)}
  function Ci (line 16) | function Ci(t,e,n){var r=function(o){o>=t.length?n():t[o]?e(t[o],(functi...
  function xi (line 16) | function xi(t){return function(e,n,r){var o=!1,a=0,i=null;wi(t,(function...
  function wi (line 16) | function wi(t,e){return Fi(t.map((function(t){return Object.keys(t.compo...
  function Fi (line 16) | function Fi(t){return Array.prototype.concat.apply([],t)}
  function Ti (line 16) | function Ti(t){var e=!1;return function(){for(var n=[],r=arguments.lengt...
  function Oi (line 16) | function Oi(t,e,n,r){var o=wi(t,(function(t,r,o,a){var i=function(t,e){"...
  function Si (line 16) | function Si(t,e){if(e)return function(){return t.apply(e,arguments)}}
  function e (line 16) | function e(e,n){t.call(this,e,n),this._startLocation=ji(this.base)}
  function ji (line 16) | function ji(t){var e=window.location.pathname,n=e.toLowerCase(),r=t.toLo...
  function e (line 16) | function e(e,n,r){t.call(this,e,n),r&&function(t){var e=ji(t);if(!/^\/#/...
  function Li (line 16) | function Li(){var t=Ui();return"/"===t.charAt(0)||(Mi("/"+t),!1)}
  function Ui (line 16) | function Ui(){var t=window.location.href,e=t.indexOf("#");return e<0?"":...
  function Ji (line 16) | function Ji(t){var e=window.location.href,n=e.indexOf("#");return(n>=0?e...
  function Ri (line 16) | function Ri(t){hi?Ei(Ji(t)):window.location.hash=t}
  function Mi (line 16) | function Mi(t){hi?vi(Ji(t)):window.location.replace(Ji(t))}
  function e (line 16) | function e(e,n){t.call(this,e,n),this.stack=[],this.index=-1}
  function Vi (line 16) | function Vi(t,e){return t.push(e),function(){var n=t.indexOf(e);n>-1&&t....
  function Gi (line 16) | function Gi(t){const e=Object.create(null);return function(n){return e[n...
  function ts (line 16) | function ts(t,e){if(!e)return;if(t(e))return t(e);return e.includes("-")...
  function is (line 16) | function is(t){return ts(rs,t)}
  function ss (line 16) | function ss(t){return ts(os,t)}
  function cs (line 16) | function cs(t){return ts(ns,t)}
  function us (line 16) | function us(t){return ts(as,t)}
  function ls (line 16) | function ls(...t){return Promise.all(t.filter(t=>t).map(async t=>{if(!us...
  function ds (line 16) | function ds(t,e){"undefined"!=typeof window&&window.__VUEPRESS__&&(windo...
  method created (line 16) | created(){if(this.siteMeta=this.$site.headTags.filter(([t])=>"meta"===t)...
  method mounted (line 16) | mounted(){this.currentMetaTags=[...document.querySelectorAll("meta")],th...
  method updateMeta (line 16) | updateMeta(){document.title=this.$title,document.documentElement.lang=th...
  method getMergedMetaTags (line 16) | getMergedMetaTags(){const t=this.$page.frontmatter.meta||[];return ps()(...
  method updateCanonicalLink (line 16) | updateCanonicalLink(){ms(),this.$canonicalUrl&&document.head.insertAdjac...
  method $page (line 16) | $page(){this.updateMeta(),this.updateCanonicalLink()}
  method beforeDestroy (line 16) | beforeDestroy(){Bs(null,this.currentMetaTags),ms()}
  function ms (line 16) | function ms(){const t=document.querySelector("link[rel='canonical']");t&...
  function As (line 16) | function As(t=""){return t?`<link href="${t}" rel="canonical" />`:""}
  function Bs (line 16) | function Bs(t,e){if(e&&[...e].filter(t=>t.parentNode===document.head).fo...
  function ys (line 16) | function ys(t){for(const e of["name","property","itemprop"])if(t.hasOwnP...
  method mounted (line 16) | mounted(){window.addEventListener("scroll",this.onScroll)}
  method setActiveHash (line 16) | setActiveHash(){const t=[].slice.call(document.querySelectorAll(".sideba...
  method beforeDestroy (line 16) | beforeDestroy(){window.removeEventListener("scroll",this.onScroll)}
  method mounted (line 16) | mounted(){Cs.a.configure({showSpinner:!1}),this.$router.beforeEach((t,e,...
  method layout (line 16) | layout(){const t=this.getLayout();return ds("layout",t),qn.component(t)}
  method getLayout (line 16) | getLayout(){if(this.$page.path){const t=this.$page.frontmatter.layout;re...
  method $dataBlock (line 16) | $dataBlock(){return this.$options.__data__block__}
  class $s (line 16) | class $s extends class{constructor(){this.store=new qn({data:{state:{}}}...
    method constructor (line 16) | constructor(){this.store=new qn({data:{state:{}}})}
    method $get (line 16) | $get(t){return this.store.state[t]}
    method $set (line 16) | $set(t,e){qn.set(this.store.state,t,e)}
    method $emit (line 16) | $emit(...t){this.store.$emit(...t)}
    method $on (line 16) | $on(...t){this.store.$on(...t)}
  method install (line 16) | install(t){const e=new $s;t.$vuepress=e,t.prototype.$vuepress=e}
  function Ds (line 16) | function Ds(t,e){const n=e.toLowerCase();return t.options.routes.some(t=...
  method render (line 16) | render(t){const e=this.pageKey||this.$parent.$page.key;return ds("pageKe...
  method openInNewWindowTitle (line 16) | openInNewWindowTitle(){return this.$themeLocaleConfig.openNewWindowText|...
  method render (line 16) | render(t,{parent:e,children:n}){if(e._isMounted)return n;e.$once("hook:m...
  method setPage (line 16) | setPage(t){this.__page=t}
  method $site (line 16) | get $site(){return t}
  method $themeConfig (line 16) | get $themeConfig(){return this.$site.themeConfig}
  method $frontmatter (line 16) | get $frontmatter(){return this.$page.frontmatter}
  method $localeConfig (line 16) | get $localeConfig(){const{locales:t={}}=this.$site;let e,n;for(const r i...
  method $siteTitle (line 16) | get $siteTitle(){return this.$localeConfig.title||this.$site.title||""}
  method $canonicalUrl (line 16) | get $canonicalUrl(){const{canonicalUrl:t}=this.$page.frontmatter;return"...
  method $title (line 16) | get $title(){const t=this.$page,{metaTitle:e}=this.$page.frontmatter;if(...
  method $description (line 16) | get $description(){const t=function(t){if(t){const e=t.filter(t=>"descri...
  method $lang (line 16) | get $lang(){return this.$page.frontmatter.lang||this.$localeConfig.lang|...
  method $localePath (line 16) | get $localePath(){return this.$localeConfig.path||"/"}
  method $themeLocaleConfig (line 16) | get $themeLocaleConfig(){return(this.$site.themeConfig.locales||{})[this...
  method $page (line 16) | get $page(){return this.__page?this.__page:function(t,e){for(let n=0;n<t...

FILE: source/.vuepress/config.js
  function genSidebarConfig (line 63) | function genSidebarConfig() {
Condensed preview — 389 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (3,312K chars).
[
  {
    "path": ".gitignore",
    "chars": 111,
    "preview": ".sync/*\n\n.me_configs.data\n\n.z_sync_configs.data\n\nsync_changes.log\n\nsync_hook.script\n\n**/.Archive\n\nnode_modules/"
  },
  {
    "path": ".vuepress/dist/404.html",
    "chars": 5023,
    "preview": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-"
  },
  {
    "path": ".vuepress/dist/assets/css/0.styles.33d1fe29.css",
    "chars": 21856,
    "preview": ".home{padding:3.6rem 2rem 0;max-width:960px;margin:0 auto}.home .hero{text-align:center}.home .hero img{max-height:280px"
  },
  {
    "path": ".vuepress/dist/assets/js/10.9e736429.js",
    "chars": 665,
    "preview": "(window.webpackJsonp=window.webpackJsonp||[]).push([[10],{175:function(t,e,i){\"use strict\";i.r(e);var s=i(0),n=Object(s."
  },
  {
    "path": ".vuepress/dist/assets/js/11.79dd85f0.js",
    "chars": 870,
    "preview": "(window.webpackJsonp=window.webpackJsonp||[]).push([[11],{176:function(t,i,n){\"use strict\";n.r(i);var a=n(0),e=Object(a."
  },
  {
    "path": ".vuepress/dist/assets/js/12.73c7bb22.js",
    "chars": 647,
    "preview": "(window.webpackJsonp=window.webpackJsonp||[]).push([[12],{177:function(t,i,n){\"use strict\";n.r(i);var e=n(0),s=Object(e."
  },
  {
    "path": ".vuepress/dist/assets/js/13.f677d7c4.js",
    "chars": 1521,
    "preview": "(window.webpackJsonp=window.webpackJsonp||[]).push([[13],{178:function(e,i,t){\"use strict\";t.r(i);var n=t(0),a=Object(n."
  },
  {
    "path": ".vuepress/dist/assets/js/14.f2b11944.js",
    "chars": 612,
    "preview": "(window.webpackJsonp=window.webpackJsonp||[]).push([[14],{179:function(a,t,s){\"use strict\";s.r(t);var e=s(0),r=Object(e."
  },
  {
    "path": ".vuepress/dist/assets/js/15.38abfb77.js",
    "chars": 647,
    "preview": "(window.webpackJsonp=window.webpackJsonp||[]).push([[15],{180:function(t,e,n){\"use strict\";n.r(e);var i=n(0),r=Object(i."
  },
  {
    "path": ".vuepress/dist/assets/js/16.3397fcb5.js",
    "chars": 1108,
    "preview": "(window.webpackJsonp=window.webpackJsonp||[]).push([[16],{181:function(t,e,r){\"use strict\";r.r(e);var i=r(0),n=Object(i."
  },
  {
    "path": ".vuepress/dist/assets/js/17.f8e05c59.js",
    "chars": 1593,
    "preview": "(window.webpackJsonp=window.webpackJsonp||[]).push([[17],{182:function(e,r,n){\"use strict\";n.r(r);var t=n(0),a=Object(t."
  },
  {
    "path": ".vuepress/dist/assets/js/18.98a9b878.js",
    "chars": 1671,
    "preview": "(window.webpackJsonp=window.webpackJsonp||[]).push([[18],{162:function(a,t,e){a.exports=e.p+\"assets/img/hashmap.15c50e9d"
  },
  {
    "path": ".vuepress/dist/assets/js/19.5a8d7fbe.js",
    "chars": 1234,
    "preview": "(window.webpackJsonp=window.webpackJsonp||[]).push([[19],{184:function(e,a,t){\"use strict\";t.r(a);var i=t(0),o=Object(i."
  },
  {
    "path": ".vuepress/dist/assets/js/2.23124c79.js",
    "chars": 82,
    "preview": "(window.webpackJsonp=window.webpackJsonp||[]).push([[2],{167:function(n,w,o){}}]);"
  },
  {
    "path": ".vuepress/dist/assets/js/20.8d6b010a.js",
    "chars": 841,
    "preview": "(window.webpackJsonp=window.webpackJsonp||[]).push([[20],{185:function(t,e,n){\"use strict\";n.r(e);var s=n(0),a=Object(s."
  },
  {
    "path": ".vuepress/dist/assets/js/21.6c600605.js",
    "chars": 989,
    "preview": "(window.webpackJsonp=window.webpackJsonp||[]).push([[21],{186:function(t,a,e){\"use strict\";e.r(a);var o=e(0),r=Object(o."
  },
  {
    "path": ".vuepress/dist/assets/js/22.c7ebece6.js",
    "chars": 1222,
    "preview": "(window.webpackJsonp=window.webpackJsonp||[]).push([[22],{187:function(t,r,e){\"use strict\";e.r(r);var n=e(0),i=Object(n."
  },
  {
    "path": ".vuepress/dist/assets/js/23.9b1d1cfc.js",
    "chars": 801,
    "preview": "(window.webpackJsonp=window.webpackJsonp||[]).push([[23],{188:function(t,e,n){\"use strict\";n.r(e);var u=n(0),i=Object(u."
  },
  {
    "path": ".vuepress/dist/assets/js/24.489e8ac8.js",
    "chars": 1771,
    "preview": "(window.webpackJsonp=window.webpackJsonp||[]).push([[24],{189:function(i,t,e){\"use strict\";e.r(t);var n=e(0),v=Object(n."
  },
  {
    "path": ".vuepress/dist/assets/js/25.1d798f32.js",
    "chars": 672,
    "preview": "(window.webpackJsonp=window.webpackJsonp||[]).push([[25],{163:function(t,e,s){t.exports=s.p+\"assets/img/fragment-life.92"
  },
  {
    "path": ".vuepress/dist/assets/js/26.e477ad95.js",
    "chars": 808,
    "preview": "(window.webpackJsonp=window.webpackJsonp||[]).push([[26],{191:function(t,a,e){\"use strict\";e.r(a);var h=e(0),s=Object(h."
  },
  {
    "path": ".vuepress/dist/assets/js/27.d297fac7.js",
    "chars": 829,
    "preview": "(window.webpackJsonp=window.webpackJsonp||[]).push([[27],{192:function(t,n,e){\"use strict\";e.r(n);var a=e(0),r=Object(a."
  },
  {
    "path": ".vuepress/dist/assets/js/28.c36b0549.js",
    "chars": 1540,
    "preview": "(window.webpackJsonp=window.webpackJsonp||[]).push([[28],{193:function(n,t,e){\"use strict\";e.r(t);var i=e(0),a=Object(i."
  },
  {
    "path": ".vuepress/dist/assets/js/29.2f26e65a.js",
    "chars": 643,
    "preview": "(window.webpackJsonp=window.webpackJsonp||[]).push([[29],{194:function(t,e,i){\"use strict\";i.r(e);var n=i(0),s=Object(n."
  },
  {
    "path": ".vuepress/dist/assets/js/3.888b2472.js",
    "chars": 530,
    "preview": "(window.webpackJsonp=window.webpackJsonp||[]).push([[3],{160:function(t,e,n){},161:function(t,e,n){\"use strict\";var a=n("
  },
  {
    "path": ".vuepress/dist/assets/js/30.1c7e4986.js",
    "chars": 1079,
    "preview": "(window.webpackJsonp=window.webpackJsonp||[]).push([[30],{195:function(t,a,e){\"use strict\";e.r(a);var n=e(0),i=Object(n."
  },
  {
    "path": ".vuepress/dist/assets/js/31.32f7c857.js",
    "chars": 511,
    "preview": "(window.webpackJsonp=window.webpackJsonp||[]).push([[31],{196:function(t,a,e){\"use strict\";e.r(a);var s=e(0),n=Object(s."
  },
  {
    "path": ".vuepress/dist/assets/js/32.a13ca202.js",
    "chars": 1954,
    "preview": "(window.webpackJsonp=window.webpackJsonp||[]).push([[32],{197:function(v,t,_){\"use strict\";_.r(t);var a=_(0),i=Object(a."
  },
  {
    "path": ".vuepress/dist/assets/js/33.90bf4621.js",
    "chars": 884,
    "preview": "(window.webpackJsonp=window.webpackJsonp||[]).push([[33],{198:function(t,e,a){\"use strict\";a.r(e);var r=a(0),n=Object(r."
  },
  {
    "path": ".vuepress/dist/assets/js/34.bb5f949f.js",
    "chars": 594,
    "preview": "(window.webpackJsonp=window.webpackJsonp||[]).push([[34],{199:function(t,e,s){\"use strict\";s.r(e);var n=s(0),i=Object(n."
  },
  {
    "path": ".vuepress/dist/assets/js/35.b283dac3.js",
    "chars": 2106,
    "preview": "(window.webpackJsonp=window.webpackJsonp||[]).push([[35],{200:function(t,i,n){\"use strict\";n.r(i);var e=n(0),v=Object(e."
  },
  {
    "path": ".vuepress/dist/assets/js/36.3032c4bb.js",
    "chars": 4421,
    "preview": "(window.webpackJsonp=window.webpackJsonp||[]).push([[36],{201:function(t,n,s){\"use strict\";s.r(n);var r=s(0),a=Object(r."
  },
  {
    "path": ".vuepress/dist/assets/js/37.6ff405bc.js",
    "chars": 929,
    "preview": "(window.webpackJsonp=window.webpackJsonp||[]).push([[37],{202:function(t,e,i){\"use strict\";i.r(e);var r=i(0),n=Object(r."
  },
  {
    "path": ".vuepress/dist/assets/js/38.f6a52e06.js",
    "chars": 775,
    "preview": "(window.webpackJsonp=window.webpackJsonp||[]).push([[38],{203:function(t,e,n){\"use strict\";n.r(e);var r=n(0),l=Object(r."
  },
  {
    "path": ".vuepress/dist/assets/js/39.7ce0a0f5.js",
    "chars": 3227,
    "preview": "(window.webpackJsonp=window.webpackJsonp||[]).push([[39],{204:function(e,t,i){\"use strict\";i.r(t);var n=i(0),s=Object(n."
  },
  {
    "path": ".vuepress/dist/assets/js/4.fe41294f.js",
    "chars": 1599,
    "preview": "(window.webpackJsonp=window.webpackJsonp||[]).push([[4],{169:function(e,t,n){\"use strict\";n.r(t);var r=n(0),i=Object(r.a"
  },
  {
    "path": ".vuepress/dist/assets/js/40.1662d618.js",
    "chars": 1105,
    "preview": "(window.webpackJsonp=window.webpackJsonp||[]).push([[40],{205:function(t,e,i){\"use strict\";i.r(e);var r=i(0),n=Object(r."
  },
  {
    "path": ".vuepress/dist/assets/js/41.2a812c43.js",
    "chars": 8807,
    "preview": "(window.webpackJsonp=window.webpackJsonp||[]).push([[41],{206:function(t,n,a){\"use strict\";a.r(n);var s=a(0),e=Object(s."
  },
  {
    "path": ".vuepress/dist/assets/js/42.5e53f08f.js",
    "chars": 1288,
    "preview": "(window.webpackJsonp=window.webpackJsonp||[]).push([[42],{207:function(e,i,t){\"use strict\";t.r(i);var a=t(0),n=Object(a."
  },
  {
    "path": ".vuepress/dist/assets/js/43.c4fa5c7d.js",
    "chars": 614,
    "preview": "(window.webpackJsonp=window.webpackJsonp||[]).push([[43],{208:function(t,i,s){\"use strict\";s.r(i);var a=s(0),e=Object(a."
  },
  {
    "path": ".vuepress/dist/assets/js/44.ae8007c2.js",
    "chars": 867,
    "preview": "(window.webpackJsonp=window.webpackJsonp||[]).push([[44],{209:function(t,e,r){\"use strict\";r.r(e);var a=r(0),n=Object(a."
  },
  {
    "path": ".vuepress/dist/assets/js/45.9cbb4e19.js",
    "chars": 577,
    "preview": "(window.webpackJsonp=window.webpackJsonp||[]).push([[45],{210:function(t,s,e){\"use strict\";e.r(s);var n=e(0),i=Object(n."
  },
  {
    "path": ".vuepress/dist/assets/js/46.2249db82.js",
    "chars": 835,
    "preview": "(window.webpackJsonp=window.webpackJsonp||[]).push([[46],{211:function(t,e,i){\"use strict\";i.r(e);var n=i(0),s=Object(n."
  },
  {
    "path": ".vuepress/dist/assets/js/47.1b41f358.js",
    "chars": 701,
    "preview": "(window.webpackJsonp=window.webpackJsonp||[]).push([[47],{164:function(t,a,s){t.exports=s.p+\"assets/img/collection.392ab"
  },
  {
    "path": ".vuepress/dist/assets/js/48.387309f2.js",
    "chars": 882,
    "preview": "(window.webpackJsonp=window.webpackJsonp||[]).push([[48],{213:function(t,s,e){\"use strict\";e.r(s);var i=e(0),n=Object(i."
  },
  {
    "path": ".vuepress/dist/assets/js/49.2316ffc9.js",
    "chars": 1772,
    "preview": "(window.webpackJsonp=window.webpackJsonp||[]).push([[49],{214:function(e,r,t){\"use strict\";t.r(r);var n=t(0),s=Object(n."
  },
  {
    "path": ".vuepress/dist/assets/js/5.b8a0041f.js",
    "chars": 294,
    "preview": "(window.webpackJsonp=window.webpackJsonp||[]).push([[5],{170:function(t,n,e){\"use strict\";e.r(n);var s=e(0),i=Object(s.a"
  },
  {
    "path": ".vuepress/dist/assets/js/50.16f26c0e.js",
    "chars": 1165,
    "preview": "(window.webpackJsonp=window.webpackJsonp||[]).push([[50],{215:function(e,t,r){\"use strict\";r.r(t);var n=r(0),i=Object(n."
  },
  {
    "path": ".vuepress/dist/assets/js/51.ad1837d2.js",
    "chars": 732,
    "preview": "(window.webpackJsonp=window.webpackJsonp||[]).push([[51],{216:function(t,e,n){\"use strict\";n.r(e);var i=n(0),a=Object(i."
  },
  {
    "path": ".vuepress/dist/assets/js/52.53997134.js",
    "chars": 2261,
    "preview": "(window.webpackJsonp=window.webpackJsonp||[]).push([[52],{217:function(e,i,t){\"use strict\";t.r(i);var n=t(0),v=Object(n."
  },
  {
    "path": ".vuepress/dist/assets/js/53.efacfabf.js",
    "chars": 765,
    "preview": "(window.webpackJsonp=window.webpackJsonp||[]).push([[53],{218:function(t,e,a){\"use strict\";a.r(e);var n=a(0),r=Object(n."
  },
  {
    "path": ".vuepress/dist/assets/js/54.ec024a7e.js",
    "chars": 934,
    "preview": "(window.webpackJsonp=window.webpackJsonp||[]).push([[54],{219:function(t,e,r){\"use strict\";r.r(e);var n=r(0),a=Object(n."
  },
  {
    "path": ".vuepress/dist/assets/js/55.90a5cae5.js",
    "chars": 1178,
    "preview": "(window.webpackJsonp=window.webpackJsonp||[]).push([[55],{220:function(e,t,r){\"use strict\";r.r(t);var n=r(0),a=Object(n."
  },
  {
    "path": ".vuepress/dist/assets/js/56.c99b5c22.js",
    "chars": 2829,
    "preview": "(window.webpackJsonp=window.webpackJsonp||[]).push([[56],{221:function(e,r,t){\"use strict\";t.r(r);var n=t(0),a=Object(n."
  },
  {
    "path": ".vuepress/dist/assets/js/57.99528377.js",
    "chars": 25816,
    "preview": "(window.webpackJsonp=window.webpackJsonp||[]).push([[57],{222:function(e,r,t){\"use strict\";t.r(r);var n=t(0),a=Object(n."
  },
  {
    "path": ".vuepress/dist/assets/js/58.e0be91a5.js",
    "chars": 1894,
    "preview": "(window.webpackJsonp=window.webpackJsonp||[]).push([[58],{223:function(t,n,a){\"use strict\";a.r(n);var i=a(0),v=Object(i."
  },
  {
    "path": ".vuepress/dist/assets/js/59.76323003.js",
    "chars": 600,
    "preview": "(window.webpackJsonp=window.webpackJsonp||[]).push([[59],{224:function(t,s,e){\"use strict\";e.r(s);var n=e(0),i=Object(n."
  },
  {
    "path": ".vuepress/dist/assets/js/6.2e2bf07a.js",
    "chars": 1024,
    "preview": "(window.webpackJsonp=window.webpackJsonp||[]).push([[6],{171:function(a,e,t){\"use strict\";t.r(e);var s=t(0),n=Object(s.a"
  },
  {
    "path": ".vuepress/dist/assets/js/60.1fff84d3.js",
    "chars": 551,
    "preview": "(window.webpackJsonp=window.webpackJsonp||[]).push([[60],{225:function(t,s,e){\"use strict\";e.r(s);var i=e(0),n=Object(i."
  },
  {
    "path": ".vuepress/dist/assets/js/61.d86a49ac.js",
    "chars": 671,
    "preview": "(window.webpackJsonp=window.webpackJsonp||[]).push([[61],{165:function(t,s,e){t.exports=e.p+\"assets/img/http.991db0e9.pn"
  },
  {
    "path": ".vuepress/dist/assets/js/62.7b2b2166.js",
    "chars": 1265,
    "preview": "(window.webpackJsonp=window.webpackJsonp||[]).push([[62],{227:function(t,e,r){\"use strict\";r.r(e);var n=r(0),i=Object(n."
  },
  {
    "path": ".vuepress/dist/assets/js/63.3de4be6c.js",
    "chars": 1541,
    "preview": "(window.webpackJsonp=window.webpackJsonp||[]).push([[63],{228:function(e,t,r){\"use strict\";r.r(t);var n=r(0),a=Object(n."
  },
  {
    "path": ".vuepress/dist/assets/js/64.f177712d.js",
    "chars": 647,
    "preview": "(window.webpackJsonp=window.webpackJsonp||[]).push([[64],{229:function(t,s,e){\"use strict\";e.r(s);var n=e(0),i=Object(n."
  },
  {
    "path": ".vuepress/dist/assets/js/65.a6025451.js",
    "chars": 894,
    "preview": "(window.webpackJsonp=window.webpackJsonp||[]).push([[65],{230:function(t,e,r){\"use strict\";r.r(e);var n=r(0),s=Object(n."
  },
  {
    "path": ".vuepress/dist/assets/js/66.61b436f9.js",
    "chars": 940,
    "preview": "(window.webpackJsonp=window.webpackJsonp||[]).push([[66],{166:function(t,e,r){t.exports=r.p+\"assets/img/architucture.956"
  },
  {
    "path": ".vuepress/dist/assets/js/67.88898059.js",
    "chars": 903,
    "preview": "(window.webpackJsonp=window.webpackJsonp||[]).push([[67],{232:function(e,t,s){\"use strict\";s.r(t);var r=s(0),n=Object(r."
  },
  {
    "path": ".vuepress/dist/assets/js/68.52455085.js",
    "chars": 6804,
    "preview": "(window.webpackJsonp=window.webpackJsonp||[]).push([[68],{233:function(e,t,r){\"use strict\";r.r(t);var n=r(0),i=Object(n."
  },
  {
    "path": ".vuepress/dist/assets/js/69.d4a08d30.js",
    "chars": 770,
    "preview": "(window.webpackJsonp=window.webpackJsonp||[]).push([[69],{234:function(t,s,e){\"use strict\";e.r(s);var i=e(0),n=Object(i."
  },
  {
    "path": ".vuepress/dist/assets/js/7.e7997178.js",
    "chars": 1529,
    "preview": "(window.webpackJsonp=window.webpackJsonp||[]).push([[7],{172:function(e,t,r){\"use strict\";r.r(t);var a=r(0),i=Object(a.a"
  },
  {
    "path": ".vuepress/dist/assets/js/70.52acb40b.js",
    "chars": 1169,
    "preview": "(window.webpackJsonp=window.webpackJsonp||[]).push([[70],{235:function(t,a,e){\"use strict\";e.r(a);var i=e(0),r=Object(i."
  },
  {
    "path": ".vuepress/dist/assets/js/71.27515e96.js",
    "chars": 1770,
    "preview": "(window.webpackJsonp=window.webpackJsonp||[]).push([[71],{236:function(e,t,r){\"use strict\";r.r(t);var n=r(0),o=Object(n."
  },
  {
    "path": ".vuepress/dist/assets/js/72.0d8204b2.js",
    "chars": 1980,
    "preview": "(window.webpackJsonp=window.webpackJsonp||[]).push([[72],{237:function(t,e,r){\"use strict\";r.r(e);var n=r(0),a=Object(n."
  },
  {
    "path": ".vuepress/dist/assets/js/73.a431f4a6.js",
    "chars": 4471,
    "preview": "(window.webpackJsonp=window.webpackJsonp||[]).push([[73],{238:function(t,n,s){\"use strict\";s.r(n);var a=s(0),e=Object(a."
  },
  {
    "path": ".vuepress/dist/assets/js/74.e30eb438.js",
    "chars": 3852,
    "preview": "(window.webpackJsonp=window.webpackJsonp||[]).push([[74],{239:function(e,t,r){\"use strict\";r.r(t);var n=r(0),o=Object(n."
  },
  {
    "path": ".vuepress/dist/assets/js/75.6317c6b5.js",
    "chars": 2602,
    "preview": "(window.webpackJsonp=window.webpackJsonp||[]).push([[75],{240:function(t,e,a){\"use strict\";a.r(e);var r=a(0),s=Object(r."
  },
  {
    "path": ".vuepress/dist/assets/js/76.ec7c8c11.js",
    "chars": 1231,
    "preview": "(window.webpackJsonp=window.webpackJsonp||[]).push([[76],{241:function(t,e,r){\"use strict\";r.r(e);var n=r(0),a=Object(n."
  },
  {
    "path": ".vuepress/dist/assets/js/77.50e04b3f.js",
    "chars": 706,
    "preview": "(window.webpackJsonp=window.webpackJsonp||[]).push([[77],{242:function(t,e,n){\"use strict\";n.r(e);var r=n(0),s=Object(r."
  },
  {
    "path": ".vuepress/dist/assets/js/78.759c37d0.js",
    "chars": 1545,
    "preview": "(window.webpackJsonp=window.webpackJsonp||[]).push([[78],{243:function(t,_,e){\"use strict\";e.r(_);var v=e(0),n=Object(v."
  },
  {
    "path": ".vuepress/dist/assets/js/79.dbecc3a8.js",
    "chars": 3103,
    "preview": "(window.webpackJsonp=window.webpackJsonp||[]).push([[79],{244:function(e,r,n){\"use strict\";n.r(r);var t=n(0),i=Object(t."
  },
  {
    "path": ".vuepress/dist/assets/js/8.a05ad03a.js",
    "chars": 700,
    "preview": "(window.webpackJsonp=window.webpackJsonp||[]).push([[8],{173:function(t,i,e){\"use strict\";e.r(i);var s=e(0),r=Object(s.a"
  },
  {
    "path": ".vuepress/dist/assets/js/80.160ca675.js",
    "chars": 18084,
    "preview": "(window.webpackJsonp=window.webpackJsonp||[]).push([[80],{245:function(t,a,s){\"use strict\";s.r(a);var n=s(0),e=Object(n."
  },
  {
    "path": ".vuepress/dist/assets/js/9.981b483c.js",
    "chars": 686,
    "preview": "(window.webpackJsonp=window.webpackJsonp||[]).push([[9],{174:function(t,i,n){\"use strict\";n.r(i);var s=n(0),e=Object(s.a"
  },
  {
    "path": ".vuepress/dist/assets/js/app.3c9e1f27.js",
    "chars": 198773,
    "preview": "(window.webpackJsonp=window.webpackJsonp||[]).push([[0],[]]);!function(t){function e(e){for(var r,a,s=e[0],c=e[1],u=e[2]"
  },
  {
    "path": ".vuepress/dist/index.html",
    "chars": 8218,
    "preview": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-"
  },
  {
    "path": ".vuepress/dist/source/index.html",
    "chars": 6207,
    "preview": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-"
  },
  {
    "path": ".vuepress/dist/source/interview/==和equals和hashCode的区别-乐视.html",
    "chars": 7297,
    "preview": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-"
  },
  {
    "path": ".vuepress/dist/source/interview/ANR定位和修正.html",
    "chars": 6794,
    "preview": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-"
  },
  {
    "path": ".vuepress/dist/source/interview/AndroidService与Activity之间通信的几种方式.html",
    "chars": 6155,
    "preview": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-"
  },
  {
    "path": ".vuepress/dist/source/interview/Android为每个应用程序分配的内存大小是多少?-美团.html",
    "chars": 6172,
    "preview": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-"
  },
  {
    "path": ".vuepress/dist/source/interview/Android代码中实现WAP方式联网-360.html",
    "chars": 6152,
    "preview": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-"
  },
  {
    "path": ".vuepress/dist/source/interview/Android动画框架实现原理.html",
    "chars": 6357,
    "preview": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-"
  },
  {
    "path": ".vuepress/dist/source/interview/Android各个版本API的区别.html",
    "chars": 6134,
    "preview": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-"
  },
  {
    "path": ".vuepress/dist/source/interview/Android属性动画特性-乐视-小米.html",
    "chars": 6959,
    "preview": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-"
  },
  {
    "path": ".vuepress/dist/source/interview/ArrayMap对比HashMap.html",
    "chars": 6099,
    "preview": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-"
  },
  {
    "path": ".vuepress/dist/source/interview/ContentProvider-乐视.html",
    "chars": 6134,
    "preview": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-"
  },
  {
    "path": ".vuepress/dist/source/interview/Glide源码解析.html",
    "chars": 7761,
    "preview": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-"
  },
  {
    "path": ".vuepress/dist/source/interview/Handler消息处理.html",
    "chars": 9047,
    "preview": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-"
  },
  {
    "path": ".vuepress/dist/source/interview/HashMap的实现原理-美团.html",
    "chars": 7666,
    "preview": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-"
  },
  {
    "path": ".vuepress/dist/source/interview/LinearLayout对比RelativeLayout-百度.html",
    "chars": 6677,
    "preview": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-"
  },
  {
    "path": ".vuepress/dist/source/interview/Requestlayout,onlayout,onDraw,DrawChild区别与联系-猎豹.html",
    "chars": 6426,
    "preview": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-"
  },
  {
    "path": ".vuepress/dist/source/interview/Touch事件传递流程-小米.html",
    "chars": 7875,
    "preview": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-"
  },
  {
    "path": ".vuepress/dist/source/interview/Ubuntu编译安卓系统-百度.html",
    "chars": 6204,
    "preview": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-"
  },
  {
    "path": ".vuepress/dist/source/interview/activity-window-view三者的差别-fragment的特点-360.html",
    "chars": 6980,
    "preview": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-"
  },
  {
    "path": ".vuepress/dist/source/interview/fragment生命周期.html",
    "chars": 6109,
    "preview": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-"
  },
  {
    "path": ".vuepress/dist/source/interview/hashmap和hashtable的区别-乐视-小米.html",
    "chars": 6693,
    "preview": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-"
  },
  {
    "path": ".vuepress/dist/source/interview/index.html",
    "chars": 6288,
    "preview": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-"
  },
  {
    "path": ".vuepress/dist/source/interview/int-char-long各占多少字节数.html",
    "chars": 6207,
    "preview": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-"
  },
  {
    "path": ".vuepress/dist/source/interview/intentService作用是什么,AIDL解决了什么问题?-小米.html",
    "chars": 7331,
    "preview": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-"
  },
  {
    "path": ".vuepress/dist/source/interview/int与integer的区别.html",
    "chars": 6130,
    "preview": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-"
  },
  {
    "path": ".vuepress/dist/source/interview/invalidate和postInvalidate的区别及使用-百度.html",
    "chars": 7362,
    "preview": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-"
  },
  {
    "path": ".vuepress/dist/source/interview/java.html",
    "chars": 6027,
    "preview": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-"
  },
  {
    "path": ".vuepress/dist/source/interview/java多态-乐视.html",
    "chars": 7147,
    "preview": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-"
  },
  {
    "path": ".vuepress/dist/source/interview/java排序查找算法-美团.html",
    "chars": 7150,
    "preview": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-"
  },
  {
    "path": ".vuepress/dist/source/interview/java状态机.html",
    "chars": 6077,
    "preview": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-"
  },
  {
    "path": ".vuepress/dist/source/interview/launchmode应用场景-百度-小米-乐视.html",
    "chars": 7376,
    "preview": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-"
  },
  {
    "path": ".vuepress/dist/source/interview/string-stringbuffer-stringbuilder区别-小米-乐视-百度.html",
    "chars": 9170,
    "preview": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-"
  },
  {
    "path": ".vuepress/dist/source/interview/view绘制流程-百度.html",
    "chars": 7198,
    "preview": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-"
  },
  {
    "path": ".vuepress/dist/source/interview/volley解析-美团-乐视.html",
    "chars": 6660,
    "preview": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-"
  },
  {
    "path": ".vuepress/dist/source/interview/什么导致线程阻塞-58-美团.html",
    "chars": 8407,
    "preview": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-"
  },
  {
    "path": ".vuepress/dist/source/interview/什么情况导致oom-乐视-美团.html",
    "chars": 6796,
    "preview": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-"
  },
  {
    "path": ".vuepress/dist/source/interview/什么情况导致内存泄漏-美团.html",
    "chars": 12250,
    "preview": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-"
  },
  {
    "path": ".vuepress/dist/source/interview/优化自定义view百度-乐视-小米.html",
    "chars": 6726,
    "preview": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-"
  },
  {
    "path": ".vuepress/dist/source/interview/低版本SDK实现高版本api-小米.html",
    "chars": 6101,
    "preview": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-"
  },
  {
    "path": ".vuepress/dist/source/interview/内存模型.html",
    "chars": 7136,
    "preview": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-"
  },
  {
    "path": ".vuepress/dist/source/interview/内部类.html",
    "chars": 6064,
    "preview": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-"
  },
  {
    "path": ".vuepress/dist/source/interview/内部类的作用-乐视.html",
    "chars": 6257,
    "preview": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-"
  },
  {
    "path": ".vuepress/dist/source/interview/列举java的集合和继承关系-百度-美团.html",
    "chars": 6138,
    "preview": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-"
  },
  {
    "path": ".vuepress/dist/source/interview/哪些情况下的对象会被垃圾回收机制处理掉-美团-小米.html",
    "chars": 6369,
    "preview": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-"
  },
  {
    "path": ".vuepress/dist/source/interview/图片.html",
    "chars": 9040,
    "preview": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-"
  },
  {
    "path": ".vuepress/dist/source/interview/垃圾回收.html",
    "chars": 7818,
    "preview": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-"
  },
  {
    "path": ".vuepress/dist/source/interview/多线程-360.html",
    "chars": 6173,
    "preview": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-"
  },
  {
    "path": ".vuepress/dist/source/interview/如何保证service在后台不被kill.html",
    "chars": 7417,
    "preview": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-"
  },
  {
    "path": ".vuepress/dist/source/interview/如何导入外部数据库-小米.html",
    "chars": 6221,
    "preview": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-"
  },
  {
    "path": ".vuepress/dist/source/interview/容器类之间的区别-乐视-美团.html",
    "chars": 7203,
    "preview": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-"
  },
  {
    "path": ".vuepress/dist/source/interview/常用Framework模块原理.html",
    "chars": 7832,
    "preview": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-"
  },
  {
    "path": ".vuepress/dist/source/interview/并发编程-猎豹.html",
    "chars": 11954,
    "preview": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-"
  },
  {
    "path": ".vuepress/dist/source/interview/性能优化.html",
    "chars": 36182,
    "preview": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-"
  },
  {
    "path": ".vuepress/dist/source/interview/抽象类和接口-360.html",
    "chars": 7109,
    "preview": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-"
  },
  {
    "path": ".vuepress/dist/source/interview/抽象类的意义-乐视.html",
    "chars": 6082,
    "preview": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-"
  },
  {
    "path": ".vuepress/dist/source/interview/接口的意义-百度.html",
    "chars": 6035,
    "preview": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-"
  },
  {
    "path": ".vuepress/dist/source/interview/描述一次网络请求的流程-新浪.html",
    "chars": 6108,
    "preview": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-"
  },
  {
    "path": ".vuepress/dist/source/interview/插件化.html",
    "chars": 8328,
    "preview": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-"
  },
  {
    "path": ".vuepress/dist/source/interview/数据库.html",
    "chars": 8010,
    "preview": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-"
  },
  {
    "path": ".vuepress/dist/source/interview/本地广播和全局广播有什么差别.html",
    "chars": 6132,
    "preview": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-"
  },
  {
    "path": ".vuepress/dist/source/interview/架构分析.html",
    "chars": 7162,
    "preview": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-"
  },
  {
    "path": ".vuepress/dist/source/interview/架构设计-搜狐.html",
    "chars": 6674,
    "preview": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-"
  },
  {
    "path": ".vuepress/dist/source/interview/泛型中extends和super的区别.html",
    "chars": 6795,
    "preview": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-"
  },
  {
    "path": ".vuepress/dist/source/interview/深入研究的知识点.html",
    "chars": 19044,
    "preview": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-"
  },
  {
    "path": ".vuepress/dist/source/interview/父类的静态方法能否被子类重写-猎豹.html",
    "chars": 6231,
    "preview": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-"
  },
  {
    "path": ".vuepress/dist/source/interview/百度.html",
    "chars": 6417,
    "preview": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-"
  },
  {
    "path": ".vuepress/dist/source/interview/算法.html",
    "chars": 9168,
    "preview": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-"
  },
  {
    "path": ".vuepress/dist/source/interview/线程 线程池原理-腾讯.html",
    "chars": 9155,
    "preview": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-"
  },
  {
    "path": ".vuepress/dist/source/interview/线程同步-百度.html",
    "chars": 9495,
    "preview": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-"
  },
  {
    "path": ".vuepress/dist/source/interview/网络.html",
    "chars": 14424,
    "preview": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-"
  },
  {
    "path": ".vuepress/dist/source/interview/腾讯.html",
    "chars": 7570,
    "preview": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-"
  },
  {
    "path": ".vuepress/dist/source/interview/虚拟机-百度-乐视.html",
    "chars": 7888,
    "preview": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-"
  },
  {
    "path": ".vuepress/dist/source/interview/设计模式.html",
    "chars": 6591,
    "preview": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-"
  },
  {
    "path": ".vuepress/dist/source/interview/进程和线程的区别-猎豹-美团.html",
    "chars": 6883,
    "preview": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-"
  },
  {
    "path": ".vuepress/dist/source/interview/进程间通讯机制Binder.html",
    "chars": 12802,
    "preview": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-"
  },
  {
    "path": ".vuepress/dist/source/interview/阿里巴巴.html",
    "chars": 19826,
    "preview": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-"
  },
  {
    "path": "README.md",
    "chars": 388,
    "preview": "### The top Internet companies android interview questions and answers\n\n[![](https://badge.juejin.im/entry/578d938079bc4"
  },
  {
    "path": "configs/sorts.json",
    "chars": 18941,
    "preview": "{\n    \"\": [\n        \"readme.md\", \n        \"docs\", \n        \"node_modules\", \n        \"picture\", \n        \"source\"\n    ], "
  },
  {
    "path": "deploy.sh",
    "chars": 273,
    "preview": "#!/usr/bin/env sh\n\n# 确保脚本抛出遇到的错误\nset -e\n\n# 生成静态文件\nyarn build\n\n# git init\n# git add -A\n# git commit -m 'deploy'\n\n# git pu"
  },
  {
    "path": "docs/404.html",
    "chars": 6776,
    "preview": "<!DOCTYPE html>\n<html lang=\"zh-CN\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-"
  },
  {
    "path": "docs/Android/ANR定位和修正.html",
    "chars": 18555,
    "preview": "<!DOCTYPE html>\n<html lang=\"zh-CN\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-"
  },
  {
    "path": "docs/Android/AOP技术方案.html",
    "chars": 18474,
    "preview": "<!DOCTYPE html>\n<html lang=\"zh-CN\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-"
  },
  {
    "path": "docs/Android/Apk打包流程.html",
    "chars": 18440,
    "preview": "<!DOCTYPE html>\n<html lang=\"zh-CN\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-"
  },
  {
    "path": "docs/Android/ArrayMap对比HashMap.html",
    "chars": 17872,
    "preview": "<!DOCTYPE html>\n<html lang=\"zh-CN\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-"
  },
  {
    "path": "docs/Android/Art Dalvik区别.html",
    "chars": 19171,
    "preview": "<!DOCTYPE html>\n<html lang=\"zh-CN\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-"
  },
  {
    "path": "docs/Android/Binder原理.html",
    "chars": 29662,
    "preview": "<!DOCTYPE html>\n<html lang=\"zh-CN\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-"
  },
  {
    "path": "docs/Android/ContentProvider-乐视.html",
    "chars": 17904,
    "preview": "<!DOCTYPE html>\n<html lang=\"zh-CN\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-"
  },
  {
    "path": "docs/Android/Framework.html",
    "chars": 23865,
    "preview": "<!DOCTYPE html>\n<html lang=\"zh-CN\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-"
  },
  {
    "path": "docs/Android/Glide源码解析.html",
    "chars": 19310,
    "preview": "<!DOCTYPE html>\n<html lang=\"zh-CN\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-"
  },
  {
    "path": "docs/Android/Gradle.html",
    "chars": 19132,
    "preview": "<!DOCTYPE html>\n<html lang=\"zh-CN\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-"
  },
  {
    "path": "docs/Android/Handler原理.html",
    "chars": 22033,
    "preview": "<!DOCTYPE html>\n<html lang=\"zh-CN\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-"
  },
  {
    "path": "docs/Android/Kotlin.html",
    "chars": 18527,
    "preview": "<!DOCTYPE html>\n<html lang=\"zh-CN\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-"
  },
  {
    "path": "docs/Android/LinearLayout对比RelativeLayout-百度.html",
    "chars": 18469,
    "preview": "<!DOCTYPE html>\n<html lang=\"zh-CN\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-"
  },
  {
    "path": "docs/Android/RecyclerView缓存原理.html",
    "chars": 19225,
    "preview": "<!DOCTYPE html>\n<html lang=\"zh-CN\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-"
  },
  {
    "path": "docs/Android/SP原理及优化.html",
    "chars": 18524,
    "preview": "<!DOCTYPE html>\n<html lang=\"zh-CN\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-"
  },
  {
    "path": "docs/Android/Service与Activity之间通信的几种方式.html",
    "chars": 17940,
    "preview": "<!DOCTYPE html>\n<html lang=\"zh-CN\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-"
  },
  {
    "path": "docs/Android/Touch事件传递流程-小米.html",
    "chars": 19904,
    "preview": "<!DOCTYPE html>\n<html lang=\"zh-CN\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-"
  },
  {
    "path": "docs/Android/Ubuntu编译安卓系统-百度.html",
    "chars": 18014,
    "preview": "<!DOCTYPE html>\n<html lang=\"zh-CN\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-"
  },
  {
    "path": "docs/Android/dex,odex,oat,vdex,art文件结构.html",
    "chars": 18682,
    "preview": "<!DOCTYPE html>\n<html lang=\"zh-CN\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-"
  },
  {
    "path": "docs/Android/fragment生命周期.html",
    "chars": 17957,
    "preview": "<!DOCTYPE html>\n<html lang=\"zh-CN\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-"
  },
  {
    "path": "docs/Android/index.html",
    "chars": 17667,
    "preview": "<!DOCTYPE html>\n<html lang=\"zh-CN\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-"
  },
  {
    "path": "docs/Android/launchmode应用场景-百度-小米-乐视.html",
    "chars": 19180,
    "preview": "<!DOCTYPE html>\n<html lang=\"zh-CN\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-"
  },
  {
    "path": "docs/Android/onSaveInstanceState原理.html",
    "chars": 18707,
    "preview": "<!DOCTYPE html>\n<html lang=\"zh-CN\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-"
  },
  {
    "path": "docs/Android/view绘制流程-百度.html",
    "chars": 19152,
    "preview": "<!DOCTYPE html>\n<html lang=\"zh-CN\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-"
  },
  {
    "path": "docs/Android/volley解析-美团-乐视.html",
    "chars": 18564,
    "preview": "<!DOCTYPE html>\n<html lang=\"zh-CN\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-"
  },
  {
    "path": "docs/Android/为什么不能使用Application Context显示 Dialog.html",
    "chars": 18667,
    "preview": "<!DOCTYPE html>\n<html lang=\"zh-CN\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-"
  },
  {
    "path": "docs/Android/什么情况导致oom-乐视-美团.html",
    "chars": 18693,
    "preview": "<!DOCTYPE html>\n<html lang=\"zh-CN\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-"
  },
  {
    "path": "docs/Android/什么情况导致内存泄漏-美团.html",
    "chars": 25042,
    "preview": "<!DOCTYPE html>\n<html lang=\"zh-CN\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-"
  },
  {
    "path": "docs/Android/动画框架实现原理.html",
    "chars": 18088,
    "preview": "<!DOCTYPE html>\n<html lang=\"zh-CN\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-"
  },
  {
    "path": "docs/Android/垃圾回收.html",
    "chars": 20469,
    "preview": "<!DOCTYPE html>\n<html lang=\"zh-CN\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-"
  },
  {
    "path": "docs/Android/屏幕刷新机制-腾讯.html",
    "chars": 18644,
    "preview": "<!DOCTYPE html>\n<html lang=\"zh-CN\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-"
  },
  {
    "path": "docs/Android/属性动画特性-乐视-小米.html",
    "chars": 18681,
    "preview": "<!DOCTYPE html>\n<html lang=\"zh-CN\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-"
  },
  {
    "path": "docs/Android/插件化.html",
    "chars": 20431,
    "preview": "<!DOCTYPE html>\n<html lang=\"zh-CN\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-"
  },
  {
    "path": "docs/Android/数据库.html",
    "chars": 20001,
    "preview": "<!DOCTYPE html>\n<html lang=\"zh-CN\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-"
  },
  {
    "path": "docs/Android/本地广播和全局广播有什么差别.html",
    "chars": 17877,
    "preview": "<!DOCTYPE html>\n<html lang=\"zh-CN\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-"
  },
  {
    "path": "docs/Android/架构范式.html",
    "chars": 19857,
    "preview": "<!DOCTYPE html>\n<html lang=\"zh-CN\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-"
  }
]

// ... and 189 more files (download for full content)

About this extraction

This page contains the full source code of the JackyAndroid/AndroidInterview-Q-A GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 389 files (3.0 MB), approximately 800.9k tokens, and a symbol index with 695 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!