数据结构
- 数据结构 集合
- 常见数据结构:集合,链表,队列,数组,栈,映射
- java中:List列表,Set集合,Map映射,工具类(Iterator迭代器、Enumeration枚举类、Arrays和Collections)
- Enumeration 存在于Hashtable,Vector,stack
- ArrayList
- 初识容量 10,扩容 0.5倍 增加
- fast - fail机制,modCount,记录操作次数
- ArrayList 实现了RandmoAccess接口,即提供了随机访问功能
- 多线程使用Vector和CopyOnWriteArrayList
- RandmoAccess > 对象直接遍历 > iterator
- Vector
- 初始容量 10 ,扩容可以指定,否则1倍增加
- RandmoAccess > Enumeration > for循环另一种遍历 > iterator
- LinkedList
- 双向链表,可以是队列,又可以是栈
- 不要用随机访问遍历,n次方倍
- Stack
- 栈 pop peek push
- 总结
- 快速插入和删除用LinkedList,快速查找用ArrayList
- 多线程用 Vector
- ArrayList支持序列化,arrayList不支持
- 类锁和对象锁区别
- HashMap
- 初识容量,加载因子,阈值
- 散列表,通过拉链法解决hash冲突
- 单向链表
- 初始化容量 16 扩容x2
- key value 可以为空
- HashTable
- 集成 Dictionary
- key和value不能为空
- 实现了 Enumeration
- 容量大小 11 扩容 x2 +1
- clear 将 数组每个位置都设置为空(HashMap同)
- TreeMap
- 树 红黑树
- 自然排序 或者 Comparator排序
- WeakHashMap
- ReferenceQueue 单链表
- 键是弱键
- 强 > 软 》弱 〉虚
- HashMap和HashTable
- 继承不同
- 初始化容量不同 扩容不同
- 线程安全不同
- 遍历
- value key null值
- hash 不同
- HashMap和WeakHashMap
- Cloneable和Serializable hashmap
- WeakHashMap 键是弱键
- 线程安全则有Enumeration
JAVA基础
- try - catch -finally finally中没有return,a = a+1 不会执行
- 接口是对动作的抽象,抽象类是对根源的抽象,从设计理念上,接口反映的是 “like-a” 关系,抽象类反映的是 “is-a” 关系
- sleep 不会释放锁 wait会
- yield 线程让步,所有线程抢锁资源
- join可以保证 被join的线程执行完成,再继续往下执行
- CallerRunsPolicy 所有线程运行 包括main,并且添加Runnable的线程(main)会被阻塞
- AbortPolicy 抛出异常
- DiscardPolicy丢弃掉任务
- DiscardOldestPolicy 丢弃掉队列前的任务,执行后面的任务
- 死锁条件:互斥;请求与保持;不可剥夺;循环等待
- Queue 提供了(add,offer)(remove,poll)(element,peek)
- BlockingQueue 继承Queue,提供了(add,offer,put,offer(time)),(remove,poll,take,poll(time))
- LinkedBlockingQueue和ArrayBlockingQueue中take和put的区别,前者put和take是两把锁
- ConcurrentHashMap vaule和key不能为空
java 虚拟机
- 堆,方法区;jvm stack,本地方法stack,程序计数器
- young(eden,survivor*2);old;永久代
- minor gc ;major gc
- 收集算法:
- 标记清除
- 复制
- 标记整理
- 判断对象是否可以回收?
- 引用计数法
- root搜索法(可达性分析)
- 和引用有关(强引用,软引用,弱引用,虚引用)
- Serial收集器:新生代收集器,停止复制算法
- ParNew收集器:新生代收集器,停止复制算法,多线程进行gc
- Serial Old收集器:老年代收集器,标记整理
- Parallel Old收集器:老年代收集器,多线程版gc 标记整理
- CMS :老年代收集器
- 初始化标记 停顿
- 重新标记 停顿
- 并发标记
- G1 收集器:jdk1.7,一块区域中分配 yound,old,Humongous(大对象)
- 根搜索,怎么找到根呢?
- 类加载
- 把描述类的class文件加载到内存
- 7个阶段:加载 - 验证 - 准备 - 解析 - 初始化 - 使用 - 卸载 ;其中 验证,准备,解析 统称为连接;为了支持java运行时绑定特点,解析的顺序不确定,可以在初始化后解析
- 加载:通过类全限定名获取次类二进制字节流;将字节流所代表的数据转化为运行时数据结构;方法区生成代表此类的Class对象,作为访问入口
- 验证:文件格式验证;元数据验证;字节码验证;符号引用验证
- 准备:为类变量分配内存空间,
- 解析:虚拟机将常量池的符号引用替换为直接引用的过程;动态解析与静态解析
- 初始化:对类变量进行赋值及执行静态代码块(区别与对象初始化);类对象和对象
- loadClass:首先判断类有没有加载过,如果加载过了,就直接返回Class,如果没有加载过,双亲委派机制加载;如果还是没有加载到,则调用自定义的ClassLoader的findClass
数据结构
- 算法
- 先序遍历,中序遍历,后序遍历,层级遍历
- 冒泡排序:相邻两个比较,直到排序完成
- 选择排序:在要排序的数组中,选出最小的一个和第一个交换位置
- 插入排序:从第二个开始,和数组中前面的所有数值比较且插入
- 希尔排序:切成两段,两段进行比较,然后进行插入排序
- 堆排序:每次将构建一个最大堆顶,将堆顶与数组中最后一个元素交换 (树构建最大堆顶的时间复杂度为logN);堆排序,每个子结点的的值都大于或者小雨左右结点值
- 快速排序:找一个key,j从右边开始找一个比key小的值,i从左边找一个大于key的值,交换,如果i和j相遇,则交换key和j
- 归并排序:将数组分解至2个元素,2个元素比较大小交换,然后再两两合并;最后归并是从两个有序的数组组合为1个有序数组
- 树
- 完全二叉树:只有最下面2层的结点度小于2,且最下面一层的结点都集中在该层最左边
- 满二叉树:除了叶结点外每一个结点都有左右子叶且叶结点都处在最底层的二叉树,结点度为2
- 平衡二叉树:树的左右子树高度不超过1
- 二叉查找树:中序遍历的树 ;java实现从root结点(小于->右节点,大于->左结点递归)
- 红黑树 :1.结点为黑色,2每个叶子结点为黑色NIL,3如果一个节点是红色的,则它的子节点必须是黑色的,4从一个节点到该节点的子孙节点的所有路径上包含相同数目的黑节点;
- 哈夫曼树:树的带权路径长度达到最小,则这棵树被称为哈夫曼树
- 深度优先遍历:先序遍历
- 广度优先遍历:层级遍历
- 用栈来实现深度(先序)遍历,很棒
- 用队列来实现层级遍历,很有意思
- 图
- 无向图G = (V,E) V是点,E是所有的关系
- 有向图G = (V,A) V是点,矢量A是关系
- 入边和出边,指向该顶点的边是入边,出边同理
- 度,顶点的边,入度是指向该顶点的边,出度同理
- 邻接矩阵,用矩阵来表示顶点之间的关系
- 邻接表,类似hashmap
- 深度优先遍历,优先遍历一个结点下面的结点
- 广度优先遍历,优先遍历一个结点附近的结点
- 拓扑排序,没有依赖的结点移除到队列
网络
TCP/IP
- 应用层,传输层,网络层,链路层
- 三次握手,四次挥手
- C端-》S端 发送SYN = 1,Seq = X;
- S端-〉C段 发送SYN = 1,ACK = X+1,Seq = Y
- C端-》S端 发送ACK = Y+1,Seq = Z
- 主动方 发送Fin = 1,ACK = Z,Seq = X
- 被动方 发送ACK = X+1,Seq = Z
- 被动方 发送Fin = 1,Ack = X,Seq = Y
- 主动方 发送 Ack = Y,Seq = X
Android
Activity
- 生命周期
- onStart() 可见 Activity已经显示出来,但是真正显示实在Resume中
- onResume() 可交互
- onPause()不可交互
- onStop()不可见 后台或者下一个页面
- 横竖屏切换的生命周期:onPause()->onSaveInstanceState()-> onStop()->onDestroy()->onCreate()->onStart()->onRestoreInstanceState->onResume()
Service
- 分类
- 按运行地点分类:本地服务和远程服务
- 按运行类型分类:前台服务和后台服务
- 按使用方式分类:绑定的服务和非绑定的服务
- 生命周期
- 绑定:onCreate onBund onUnBund
- 非绑定:onCreate onCommendStart onDestroy
ContentProvider
- 统一资源标识符
- 内置和自定义
- content://com.event.leo/user/1
- content:Schema,com.event.leo:授权信息,user:表名:1:id
- MIME数据类型
- 作用:制定文件用某种程序打开
- 组成:text/html 类型/子类型
- 类型形式:vnd.android.cursor.item/自定义 单条记录;vnd.android.cursor.dir/自定义 多条记录
- UriMacher,ContentResolver/ContentObserver
Fragment
自定义view
- 特殊情况:
- view消费down事件,viewgroup拦截move事件给onTouchEvent自己消费,首次move事件给view,这个事件由(move - cancel),用户手指弹起,viewgroup中的事件由(up - cancel)
IntentService
- Looper 消息顺序让 IntentService中的任务是顺序执行
- onStart中发送发送Message
APK
- aapt 编译R文件
- javac 将java文件编译为class文件
- dex 将class文件编译为dex文件
- 编译资源 将res下面的资源编译为二进制资源
- 组装 dex 文件与资源文件
- 生成debug签名
- 安装
进程优先级
- 前台进程:正在交互的activity,与前台activity绑定的service,调用了startForeground的Service,onReceiver的广播接收器
- 可视进程:activity上层弹一个dialog
- 服务进程:启动service
- 后台进程:不可见的activity
- 空进程:没有任何活动的进程
动画
- 帧动画
- 补间动画 平移,缩放,旋转,淡入淡出
- 属性动画
Bitmap
- inSampleSize 采样率 对图片宽高进行缩放。 1 2 4 8
- inJustDecodeBounds = true
- inPreferredConfig 图片质量
HTTPS
- C端 - S端请求 输入网址访问 443端口
- S端配置,有一套证书,公钥和私钥
- S端 - C端,传送证书 ,即公钥
- C端 TSL解析证书,验证,生成一个随机数,用公钥加密
- C端 - S端 发送这个加密后的随机数给后台
- S端 用私钥解密这个客服端发送的随机数,并用这个随机数加密内容
- S端 - C端,服务端发送加密后的内容
- C端 用这个随机数解密
- 后台证书/非对称加密;前台随机数/对称加密
HTTP
- Http请求报文
- HTTP请求报文由请求行:请求方法/URL/协议版本(HTTP1.0和HTTP1.1)
- 请求头部 各种数据
- 空行
- 请求数据
- HTTP响应报文
- 状态行 :协议版本/状态码/状态码描述
- 响应头部:头部字段
- 响应正文
1xx:指示信息--表示请求已接收,继续处理。 2xx:成功--表示请求已被成功接收、理解、接受。 3xx:重定向--要完成请求必须进行更进一步的操作。 4xx:客户端错误--请求有语法错误或请求无法实现。 5xx:服务器端错误--服务器未能实现合法的请求。
java 基础补充
- static静态块 - 块,变量(顺序执行) - 构造方法
- 性能优化
- 内存泄漏
- view层级
- view绘制 onDraw中减少运算
- view过度渲染
- 主题中的绘制背景为null
GC Root 对象
- GC root 收集不是Gcroot,并且没有被GCRoot引用的对象
- JVM虚拟机中栈中引用对象(方法栈中变量)
- 方法区中的类静态属性引用对象
- 方法区中常亮引用的对象(final的常量值)
- 本地方法栈JNI的引用对象
- Thrad - 活着的线程
DB
- 创建数据库 create database table
- 删除数据库 drop database table
- 创建表. create table xxxxx (column_name column_type)
- 删除表 drop table xxxxx
- Alert
- alter table xxxxx add column_name column_type
- alter table xxxxx drop column column_name
- alter table xxxxx change column_name new_column_name column_type
- alert table xxxxx rename xxxx
- 插入数据 insert into xxxxx(column_name,column_name2) values (a,b)
- 查询数据 select _column,_column from xxxxx [where Clause] [limit N][offset M]
- select * from xxxxx where binary _column='cainiao'
- 删除数据 delete from xxxxx where clause
- 更新数据 update xxxx set column_name=111 where clause
- Like用法 column_name like %a%
- union用法,连接两个select语句,默认删除重复 all/distinct
- 排序 order by column_name,column_name2 ASC/DESC
- 分组 group by column_name
- 连接查询
- 内连:from xxxxx a inner join xxxx b on a.column_name = b.column_name
- 左连:from xxxxx a left join xxxx b on a.column_name = b.column_name
- 右连:from xxxxx a right join xxxx b on a.column_name = b.column_name
- Null 条件语句中 where column_name is null/ is not null
- 事务
- begin
- commit
- rollback
- 将旧表数据插入新表 select * into new_table from old_table
Choreographer
- Choreographer
- FrameCallback
- CallbackRecord
- FrameDisplayEventReceiver
性能分析
- Fps方案
- 延迟80ms 发送一条消息
- choreographer
- CPU利用率
- /proc/start
- /proc/self/start
- CPU利用率 = 100* (total-idle)/total
- Memory使用
- Debug.getPss()
- Runtime.getRuntime().maxMemory() app最大内存
- Anr
- log中查看
- /data/anr/traces.txt中查看
- anr产生原因
- 1.普通阻塞导致的ANR
- 2.CPU满负荷
- 3.内存原因 内存不够用
- StrictMode 开启
Log文件产生
- 程序异常退出
- 程序强制关闭
- Anr
- 手动
- 系统基本信息
- MEMORY INFO (/proc/meminfo) ------ 内存
- CPU INFO (top -n 1 -d 1 -m 30 -t) ------
- ------ PROCRANK (procrank) ------
- ------ VIRTUAL MEMORY STATS (/proc/vmstat) ------
- ------ VMALLOC INFO (/proc/vmallocinfo) ------
- 时间信息
- ------ VMALLOC INFO (/proc/vmallocinfo) ------
- ------ EVENT INFO (/proc/vmallocinfo) ------
- 虚拟机信息
- ------ VM TRACES JUST NOW (/data/anr/traces.txt.bugreport: 2011-01-15 16:49:02) ------
- ------ VM TRACES AT LAST ANR (/data/anr/traces.txt: 2011-01-15 16:49:02) ------
OKHTTP
- OkhttpClient 初始化配置
- RealCall 封装了执行方法
- RealInterceptorChain 链式的调用执行 必须执行chain.proceed(request)构成链式
- Dispatcher 分发Call(enqueue)
- RetryAndFollowUpInterceptor 异常和重定向处理
- BridgeInterceptor 重构请求头和响应头
- CacheInterceptor 缓存拦截器
- ConnectInterceptor 构建请求连接
- CallServerInterceptor 请求
- HttpCodec 将http协议抽象
Retrofit
- Retrofit 门面
- ServiceMethod http请求解析
- CallAdapter call转化器
- OkHttpCall call执行器
- Converter 数据转化
Picasso
- Picasso with(context)单例获取picasso .load()得到一个RequestCreator
- RequestCreator into()
- Request
- requestKey 标示 由uri,尺寸等各种信息组成
- Action
- TargetAction
- Dispatcher 分发器
- BitmapHunter 操作相关;请求重复解决
- RequestHandler 请求处理器
- ps: targetToAction 解决了错位问题
Activity相关
- ServiceManager 服务缓存
- SystemServiceRegistry 本地的快捷服务,会从ServiceManager中获取
- SystemServer 注入到ServiceManager中服务
- ActivityManager ActivityManagerNative ActivityManagerService 区别
AIDL
- IInterface 转化
- IBindler 跨进程能力
- Binder
- Stub
- StubProxy
网友评论