我的Android知识体系
热门博客
Android知识体系汇总
Gityuan
数据结构与算法
互联网公司Android面试题汇总
隔壁老李头
23种设计模式
image.png创建型模式:
工厂模式(Factory Pattern)
抽象工厂模式(Abstract Factory Pattern)
单例模式(Singleton Pattern)
建造者模式(Builder Pattern)
原型模式(Prototype Pattern)结构型模式:
适配器模式(Adapter Pattern)
桥接模式(Bridge Pattern)
过滤器模式(Filter、Criteria Pattern)
组合模式(Composite Pattern)
装饰器模式(Decorator Pattern)
外观模式(Facade Pattern)
享元模式(Flyweight Pattern)
代理模式(Proxy Pattern)行为型模式:
责任链模式(Chain of Responsibility Pattern)
命令模式(Command Pattern)
解释器模式(Interpreter Pattern)
迭代器模式(Iterator Pattern)
中介者模式(Mediator Pattern)
备忘录模式(Memento Pattern)
观察者模式(Observer Pattern)
状态模式(State Pattern)
空对象模式(Null Object Pattern)
策略模式(Strategy Pattern)
模板模式(Template Pattern)
访问者模式(Visitor Pattern)
插件化
插件化学习之路
MultiDex工作原理分析和优化方案
Android关于Dex拆分(MultiDex)技术详解
MultiDex中出现的main dex capacity exceeded解决之道
Too many classes in --main-dex-list
cocos2d-x
Cocos官网
cocos2d-x 减少编译时间/免除重复编译
Cocos2dx.3x入门三部曲
第三方动画框架
YY-SVGA动画框架
Lottie- 让Android动画实现更简单
控件位置
Flutter
想入门 Google 的 Flutter?我整理了一些资料看你需要吗?
Flutter教程
热修复
组件化
主要是解决个组件之间的通信问题
ARouter 源码浅析
业界首个支持渐进式组件化改造的Android组件化开源框架
APT
元注解简介
编写最基本的APT Demo
一起玩转Android项目中的字节码
Gradle 插件
Android app 启动流程
Activity启动流程
image.pngBundle 机制
红茶一杯话Binder
Android Binder之应用层总结与分析
理解Android Binder机制(1/3):驱动篇
Java集合类工作原理及实现
HashMap是什么
结论:HashMap是由数组和链表组合构成的数据结构,Java8中链表长度超过8时会把长度超过8的链表转化成红黑树;存取时都会根据键值计算出”类别”(hashCode),再根据”类别”定位到数组中的位置并执行操作。
HashCode是什么
结论:hashCode是一个对象的标识,Java中对象的hashCode是一个int类型值。通过hashCode来指定数组的索引可以快速定位到要找的对象在数组中的位置,之后再遍历链表找到对应值,理想情况下时间复杂度为O(1),并且不同对象可以拥有相同的hashCode。
HashMap的时间复杂度
结论:HashMap的时间复杂度取决于hash算法,优秀的hash算法可以让时间复杂度趋于常数O(1),糟糕的hash算法可以让时间复杂度趋于O(N)。
负载因子是什么
结论:我们知道HashMap中默认的数组长度是16,默认负载因子为0.75。在数组大小不变的情况下,存放键值对越多,查找的时间效率会降低,扩容可以解决该问题,而负载因子决定了什么时候扩容,负载因子是已存键值对的数量和总的数组长度的比值。默认情况下负载因子为0.75,我们可在初始化HashMap的时候自己修改。
数据结构与算法
线程安全List
private static List<String> TEST_LIST = Collections.synchronizedList(new ArrayList<String>());
Collections.synchronizedList进行包装
图片加载原理
多线程断点续传
RandomAcessFile类实现文件的分割和合并
http1.1 头文件中传入
Content-Range: bytes 20000-40000/47000
线程
线程创建的三种方式
1.新建类继承 Thread 类实现线程
2.通过实现接口 Runnable 实现创建线程
3.使用 ExecutionException、Callable、ExecutorService、Future 等类,Executors 框架实现线程,此方法:相对前两种可抛异常,且有返回值。
run和start的区别
run 只是普通的方法调用,start会创建新线程
start()实际上是通过本地方法start0()启动线程的。而start0()会新运行一个线程,新线程会调用run()方法,start0是native方法。创建线程会消耗系统资源。
JVM
类的生命周期
Java虚拟机类生命周期
加载 验证 准备 解析 初始化 使用 卸载
RxJava
EventBus实现原理
大文件加密
文件批量上传和下载
OkGo,一个专注于让网络请求更简单的框架,与RxJava完美结合,比Retrofit更简单易用
App 启动时间统计
Android 软件稳定性解决方案
ThreadLocal原理
Classloader
代码优化
SharedPreferences
对 SharedPreferences 再多一点了解
通过 ContentProvider 多进程共享 SharedPreferences 数据
SharedPreferences不是线程同步的,如果要进行跨进程调用请用ContentProvider代替
SurfView
SurfaceView继承了View,但是我们并不需要去实现它的draw方法来绘制自己,为什么呢?因为它和View有一个很大的区别,View在UI线程去更新自己;而SurfaceView则在一个子线程中去更新自己;这也显示出了它的优势,当制作游戏等需要不断刷新View时,因为是在子线程,避免了对UI线程的阻塞。
Android视图SurfaceView的实现原理分析
BroadcastReceiver,LocalBroadcastReceiver 区别
应用场景
1.BroadcastReceiver用于应用之间的传递消息;
2.而LocalBroadcastManager用于应用内部传递消息,比broadcastReceiver更加高效。
安全
1.BroadcastReceiver使用的Content API,所以本质上它是跨应用的,所以在使用它时必须要考虑到不要被别的应用滥用;
2.LocalBroadcastManager不需要考虑安全问题,因为它只在应用内部有效。
Handler 机制
Android 事件传递机制
GC机制
Https 优化
DNS,携带数据,直接访问IP
深入理解https通信加密过程
TCP/UDP的区别
TCP:面向连接、传输可靠(保证数据正确性,保证数据顺序)、用于传输大量数据(流模式)、速度慢,建立连接需要开销较多(时间,系统资源)。
UDP:面向非连接、传输不可靠、用于传输少量数据(数据包模式)、速度快
http协议
Socket
Java并发编程
image.pngJava线程池
线程的状态
image.png
新建状态:新建线程对象,并没有调用start()方法之前
就绪状态:调用start()方法之后线程就进入就绪状态,但是并不是说只要调用start()方法线程就马上变为当前线程,在变为当前线程之前都是为就绪状态。值得一提的是,线程在睡眠和挂起中恢复的时候也会进入就绪状态哦。
运行状态:线程被设置为当前线程,开始执行run()方法。就是线程进入运行状态
阻塞状态:线程被暂停,比如说调用sleep()方法后线程就进入阻塞状态
死亡状态:线程执行结束
App如何沙箱化
单元测试
快速打包
GIT操作
修改最后一次提交 : git commit --amend
取消已经暂存的文件 : git reset HEAD <file>...
取消对文件的修改: git checkout -- <file>...
代码合并:Merge、Rebase 的选择
异同:
如果你想要一个干净的、线性的提交历史,没有不必要的合并提交,你应该使用 git rebase 而不是 git merge 来并入其他分支上的更改。
另一方面,如果你想要保存项目完整的历史,并且避免重写公共分支上的 commit, 你可以使用 git merge。两种选项都很好用,但至少你现在多了 git rebase 这个选择