Android知识体系
语言
java基础
-
数据类型
-
基础数据类型
- 基础数据类型相关运算
- byte/8,char/16,short/16,int/32,float/32,double/64,long/64,boolean
-
缓存池
-
区别新建对象和使用缓存池中的对象
- Integer.valueOf(123) == Integer.valueOf(123) 引用缓存池中的同一个对象
- new Integer(123) != new Integer(123)这是两个对象
Integer -128-127
Short -128-127
Boolean true false
-
-
包装数据类型
- 自动装箱会调用valueOf()
-
-
String相关
-
特性
-
final修饰 不可被继承
-
不可变好处
- 线程安全
- 字符串常量池数据共享,节省资源
-
java 8内部使用char[]存储数据
java 9 内部使用byte[]存储数据
-
-
字符串常量池
new String("aa") != new String("aa")
intern(). 从常量池中获取字符串, 如果没有该字符串将创建一个
String a = "11"; String b = "11"; a ==b 在编译时期就会将11放入字符串常量池中
-
String a = new String ("abc")创建两个对象(常量池中不存在abc的情况下)
- "abc"字符串字面量
- new会创建字符串对象
String s2="a"+"b",String s3="a",String s4="b",s5=s3+s4 a2 != s5
编译器会被s2优化为ab, 直接放入常量池中, 而s5相当于new String("ab") 是在堆中
-
String,StringBuffer,StringBuilder
String,StringBuffer不可变,线程安全
-
StringBuilder线程不安全
- StringBuffer中很多方法是使用Synchronized修饰的,保证线程安全
StringBuilder的性能比StringBuffer更高
-
==与equals
- 基本数据类型 == 用于比较值是否相同
- 引用数据类型 == 比较地址
euqals() 比较引用的对象值是否相同 - Java 规范,使用 equal() 方法来判断两个相等的对象,必须具有相同的 hashcode。
-
-
反射
-
java.lang.reflect
-
Field get(), set()
- getFiled()
- getDeclaredFiled()
-
Method invoke()
- getDeclaredMethods()
- getMethods()
- getMethod(String name, Class<?>... parameterTypes) 获得指定参数方法
-
Constructor 创建新的对象
- c.newInstance()
- constructor.newInstance()创建指定构造器的实例
-
-
获得Class对象
- Class.forName(对象)
- 对象.class
- 对象.getClass()
-
集合Collection
- List(元素有序, 且可以重复)
- vector
- Arraylist
- 线程不安全, 效率高
- Map(元素无序, 且key不能重复)
- HashMap
- 1.7数组+链表
- 1.8数组+红黑树
- 允许null值作为key或value
- HashTable
- 线程安全, java1.1以前
- set(不许有重复的元素,和list一样单列元素的集合)
- hashset 重写了equals与hashcode方法, 从保证加入到hashSet中的对象没有重复的
- treeset
- 只能通过iterator遍历器获取数据元素,不存在索引
-
线程
-
线程池
-
Android中四种常见的线程池
- FixedThreadPool 核心线程数和最大线程数相同, 核心线程不会被回收, 除非关闭线程池
- CacheThreadPool 无核心线程, 最大线程数为int的最大值,
- ScheduledThreadPool 核心线程数量固定, 非核心线程无限制, 非核心线程闲置时间10s
- SingleThreadExecutor 只有一个核心线程,保证所有任务都在同一个线程中按顺序执行
-
ThreadPoolExecutor
- int corePoolSize, //核心线程数
- int maximumPoolSize,//最大线程数
- ong keepAliveTime,//线程在空闲时间多久会终止
- TimeUnit unit, //空闲时间的单位
- BlockingQueue<Runnable> workQueue // 阻塞队列,用来存储等待缓存的线程)
-
-
线程安全
- volatile: 特殊修饰符, 只有成员变量才能使用. 保证下一个读操作会在前一个写操作之后发生
-
基础概念
- 线程是进程的子集,1个进程可以有多个线程
- start()和run()方法区别: start会真正启动一个线程, 内部会调用run方法, 而run只是启动当前线程 不会创建新的线程
- 继承Thread或者实现Runnable接口来实现线程, 使用runnable接口灵活性更高, 源于java的单继承多实现
- Callable接口的call可以有返回值和处理异常, 而run方法没有, 涉及到计算时可以使用callable接口
- wait()和sleep()的区别, wait会释放锁, sleep不会释放锁
-
IO
-
java虚拟机
-
垃圾回收机制
-
引用类型
-
强引用
- 不会被垃圾回收机回收, 最终会报outofMemofyError
-
软引用
-
jvm在空间不足时会将软引用回收
- 可以和hashmap联合使用, 用作图片缓存, 避免oom
-
-
弱引用
- jvm一旦发现有弱引用,无论空间是否充足都会被收回
-
虚引用
- 相当于没有引用, 在任何时候都会被垃圾回收机收回
-
-
算法
-
标记-清除
- 将无引用的数据进行标记清除
-
标记-整理
- 将有效数据向前挪进, 清除剩余数据
-
标记-复制
- 需要分出一半的内存用于垃圾回收, 也可根据新生代的比例回收
-
-
机制----- 分代回收
- 新生代, 老年代, 永久代 ---根据三者的存活比例进行算法选择, 内存的分配是发生在新生代中, 根据新生代的比例分配内存, 从而选择回收的算法
-
判断对象是否存活
-
可达性算法GC Roots 从这些点开始向下搜做 若一个对象没有任何引用链可以到达gcroot, 及该对象是不可达的, 失效对象
- 虚拟机栈中引用的对象
- 方法区中类静态属性引用的对象
- 方法区中常量引用的对象
- 本地方法栈中引用的对象
-
引用计数器
- 存在两个失效对象相互引用问题
-
System.gc() 通知GC开始工作, 但是真正开始的时间不确定
-
特性: 平台无关性
-
运行时数据区域
-
堆
- 所有类型的对象和数组
- jvm只有一个堆, 被所有线程共享
- 不存放基本类型和对象的引用
-
栈
- 每个线程包含一个栈区, 栈和栈之间是私有的,不可以相互访问
- 局部变量, 操作数和异常数据
-
方法区
- 被所有线程共享
- 所有的class和static变量,该类型的常量池(类名,成员变量名等,以及方法引用,成员变量引用)
-
-
类加载机制
虚拟机把描述类的数据从Class文件加载到内存, 并对数据进行校验,转换解析和初始化, 最终形成可以被虚拟机直接使用的java类型
-
双亲委派模型
- 一个类加载器收到一个类的加载请求, 会将这个请求委派给父类加载器,每个层级都如此, 最后所有的请求都会传送给顶层的启动类加载器,这有顶层的启动类加载器无法完成加载请求时,子类才会尝试加载
-
流程(实质可以理解为 初始化分配class及类变量)
-
加载
- 通过类的全限定名获取二进制字节流, 将字节流所代表的静态存储结构转化为方法区的运行时数据结构,在java堆中生成一个代表此类的class对象
-
校验
- 确保class字节流不危害虚拟机自身的安全
-
准备
- 为类变量(被static修饰的)在方法区中分配内存
- 被final修饰的不管, 在编译期间就会分配好
- 实例变量会被分配到堆内存
-
解析
- 将常量池中的符号引用替换为直接引用
-
初始化
- 初始化类变量和其他资源
使用
卸载
-
-
kotlin
基础知识体系
四大组件
-
Activity
- 生命周期 - 启动模式 - 组件间通信
Broadcast
Service
ContentProvider
常用组件
Fragment
LinearLayout&RelativeLayout&FrameLayout&ConstraintLayout
RecycleView
Webview
-
Window
- Toast, Dialog,PopuWindow
View
- 绘制
- 事件分发
- 自定义view
动画
- 帧动画
- 属性动画
- view动画
数据存储
- SharePrefance
- SQLite
- File
- 网络存储
通信机制
- handler通信机制
适配
系统版本
- min SDK
- target SDK
屏幕尺寸
- layout
屏幕分辨率
- Drawable
- dimens
实战技术工具
Git
- 工具
- 操作命令
- git管理机制
Android Studio使用
logcat
adb
-
常用插件
- GsonFormat
- ButterKnife Zelezny
- Android Drawable Importer
网络相关
http
- Http方法
- 状态码
- Https
常见问题解决
OOM
- 使用软引用和弱引用: 用一个HashMap来保存图片的路径和相应图片对象关联的软引用之间的映射关系, 当内存不足的时候,jvm会自动回收缓存图片对象占用的空间
- 使用hashmap增强软引用功能, 避免对象的多次重复创建, 提高系统的性能
内存优化
布局优化
大图片加载
内存泄漏
前沿技术
组件化
- 路由Arouter
模块化
热修复
- Tinker
增量更新
RN
设计模式
开发框架设计模式
MVC
MVP
-
MVVM
- Databinding
- LiveData
常见设计模式
- 单例模式
- 工厂模式
- 适配器模式
- 观察者模式
- 代理模式
- ....
算法,数据结构
排序
- 选择排序
- 冒泡排序
- 插入排序
- 希尔排序
- 归并排序
- 快速排序
- 堆排序
- 基数排序
栈和队列
- 栈
- 队列
- 链表
树
- 二叉查找树
- 红黑树
- 2-3查找树
- 散列表
接入第三方库
推送
- 极光
- 华为,小米
地图
- 高德地图
支付
- 微信
- 支付宝
统计
- 友盟
异常记录
- bugly
常用三方库
网络请求
- Retrofit
- okhttp
- volley
异步框架
- RXjava2
图片加载
- Glide
- Picasso
- Fresco
事件
- EventBus
路由
- Arouter
依赖注入
- Butterknife
- Dagger2
数据库
- GreenDao
Json转化
- Gson
- Fastjson
XMind: ZEN - Trial Version