导图社区 BruceVan数据算法结构概念知识点笔记
BruceVan数据算法结构概念知识点笔记:Activity有几种启动方式?ActivityInfo.LAUNCH_MULTIPLE;ActivityInfo.LAUNCH_SINGLE_INSTANCE;ActivityInfo.LAUNCH_SINGLE_TASK。
编辑于2022-11-10 17:40:25 广东BruceVan数据算法结构概念知识点笔记
UML
单例模式
工厂、抽象工厂
策略模式与状态机
Android
基础
UI
Activity有几种启动方式?
ActivityInfo.LAUNCH_MULTIPLE
不论当前任务栈中是否存在该Activity,都会新建一个Activity,如 任务栈为A B,要启动B 那么任务栈为 A B B 不同的app之间: 当前台的Activity启动后台任务的Activity,不管这个Activity在后台任务栈中是否已经存在,都会创建一个新的Activity,并将它加入前台的任务栈中
ActivityInfo.LAUNCH_SINGLE_INSTANCE
将一个Activity的launchMode设置为该值时,表明这个Activity独自占用一个任务队列,这个队列中不让在加入其他的Activity 不同app 如果前台Activity启动后台任务的Activity,如果后台任务栈中已经有该Activity,那么就会调用该Activity的onNewIntent,并且后台任务还是在后台。如果后台任务栈中没有该Activity,那么会重新创建一个Acitivyt,并单独放入一个任务栈,其实在启动该Acitivity的Intent中也会加入上述标记
ActivityInfo.LAUNCH_SINGLE_TASK
如果当前任务中存在要启动的Activity,那么就不会创建新的Activity,如果不存在就会创建新的Activity,如任务栈为 A B C,启动B ,那么任务栈就会变为A B 不同app: 如果前台的Activity启动后台任务的Activity,不管这个Activity是否在栈顶,都会将后台的任务栈移到前台,前台任务栈移至后台。这里不需要考虑标记问题,因为被启动的Activity如果是singleTask,那么自动在启动Activity的intent中加入上述标记。
ActivityInfo.LAUNCH_SINGLE_TOP
如果当前要创建的Activity就在任务栈的顶端,那么不会创建新的Activity,仅仅调用Activity的onNewIntent,如果不在栈顶(或者栈中没有该Activity),那么还是会创建新的Activity,如任务栈为A B 启动B 任务栈变为 A B 如果 启动A 那么任务栈为 A B A 不同app之间: 如果前台的Activity启动后台任务的Activity,并且这个Activity已经在后台任务的栈顶,和app内不同的是,这里还不能确定是否会创建新的Activity. 这里还需要看启动Activity的Intent里面是否有Intent.FLAG_ACTIVITY_NEW_TASK,如果此标记,那么就会将后台的任务队列移动到前端,如 前端任务栈 A B 后端任务栈 E F C,现在前端需要启动一个C,如果有Intent.FLAG_ACTIVITY_NEW_TASK,那么后端任务栈就会移到前端(并调用C的onNewIntent),前端栈退居后端。如果没有这个标记,那么仅仅就是在前端任务栈中创建一个新的Activity C。
Fragment生命周期
RecycleView 、ListVIew
内存管理
MVC模式(ViewHolder?)
创建销毁逻辑
Handler
消息队列模型?
四大组件的作用和用法?
持久化
源码
Activity
程序启动流程
Launcher.png
程序内启动Activity流程
WindowManagerService
Binder机制
AMS
开源库
多线程、RxJava
图片库:Fresco、Picasso
消息分发:EventBus
持久化
网络:Retrofit、Okhttp
TCP/IP
基础知识
url
URI,URL,URN有什么区别?
URI:代表统一资源标识符,指向一个资源的目标地址 URL:是URI最常见的一种实现(但不是唯一实现) URN:统一资源名,URI另一种实现,对外只使用资源名,对内做映射。目前试验阶段。
URL的语法?
URL由九个通用格式组成 ://:@:;?# scheme: 访问服务器以获取资源使用哪种协议 user:password :略 host、port : 主机名或ip地址:duankou params: 参数,key/value,可选部分 query:查询,略 frag:片段,一小片或一部分资源的名字。引用对象时不会将frag字段传给服务器,客户端内部使用,比如业内跳转(见知乎)
http
报文
方法
trace方法有啥用
trace 请求会在目的服务器端发起一个“环回”诊断。行程最后一站的服务器会弹回一条 trace 相应,并在相应主体中携带它收到的原始请求报文。 主要用来看代理服务器等中介对原始报文做哪些修改——比如提升http版本号,加几个header等。
get和post方法区别
送分题略
连接处理
tcp
特性
TCP建立连接?
三次握手 第一次握手:主机A发送位码为syn=1,随机产生seq number=1234567的数据包到服务器,主机B由SYN=1知道,A要求建立联机; 第二次握手:主机B收到请求后要确认联机信息,向A发送ack number=(主机A的seq+1),syn=1,ack=1,随机产生seq=7654321的包 第三次握手:主机A收到后检查ack number是否正确,即第一次发送的seq number+1,以及位码ack是否为1,若正确,主机A会再发送ack number=(主机B的seq+1),ack=1,主机B收到后确认seq值与ack=1则连接建立成功。
TCP断开连接?
TCP协议的连接是全双工连接,一个TCP连接存在双向的读写通道。 简单说来是 “先关读,后关写”,一共需要四个阶段。以客户机发起关闭连接为例:(四次挥手) 1.服务器读通道关闭 2.客户机写通道关闭 3.客户机读通道关闭 4.服务器写通道关闭 详细过程: 第一阶段 客户机发送完数据之后,向服务器发送一个FIN数据段,序列号为i; 1.服务器收到FIN(i)后,返回确认段ACK,序列号为i+1,关闭服务器读通道; 2.客户机收到ACK(i+1)后,关闭客户机写通道; (此时,客户机仍能通过读通道读取服务器的数据,服务器仍能通过写通道写数据) 第二阶段 服务器发送完数据之后,向客户机发送一个FIN数据段,序列号为j; 3.客户机收到FIN(j)后,返回确认段ACK,序列号为j+1,关闭客户机读通道; 4.服务器收到ACK(j+1)后,关闭服务器写通道。
TCP控流?
滑动窗口
https
与HTTP架构不同的地方?
在HTTP与TCP层中间加了SSL or TLS 层
SSL握手
交换协议版本号 选择一个两端都了解的密码 对两端身份进行认证 生成临时的会话秘钥,加密信道
性能优化
TCP性能优化
HTTP事务时延
TCP建立连接的握手时延?
用大量连接只传递少量数据 解决:重用现存连接
延迟确认时延?
服务器的一种捎带ACK算法。 延迟确认算法会在一个特定的窗口时间(100-200ms)将输出确认存放在缓冲区,以寻找能够捎带它的数据分组(segment) *比如Microsoft TCP栈使用了下面的策略来决定在接收到数据包后 什么时候发送ACK确认数据包: 1、如果在200毫秒的计时器超时之前,接收到下一个数据包,则立即发送ACK确认数据包。 2、如果当前恰好有数据包需要发给ACK确认信息的接收端,则把ACK确认信息附带在数据包上立即发送。 3、当计时器超时,ACK确认信息立即发送。 这种算法不适合具有客户端也有阻塞请求队列的情况。 举例: TCP客户端需要发送10000个记录到Winsock TCP服务端,保存到数据库。记录大小从20字节到100 字节不等。对于简单的应用程序逻辑,可能的设计方案如下: 1、客户端以阻塞方式发送,服务端以阻塞方式接收。 2、客户端设置SO_SNDBUF为0,禁用Nagle算法,让每个数据包单独的发送。 3、服务端在一个循环中调用Recv接收数据包。给Recv传递200字节的缓冲区以便让每个记录在一次Recv调用中 被获取到。 Boom……
Nagle算法
慢启动时延
TCP连接会随时间进行自我调谐,开始会限制连接的最大速度,如果数据成功传输,会随着时间的推移提高传输速度,这种调谐成为TCP慢启动,用于防止因特网的突然过载和拥塞。 Again,重用连接,or调整启动时的连接顺序,先小后大
TIME_WAIT累积与端口耗尽
串行处理事务时延
解决拥塞算法?
拥塞控制机制。最初由V. Jacobson在1988年的论文中提出的TCP的拥塞控制由“慢启动(Slow start)”和“拥塞避免(Congestion avoidance)”组成,后来TCP Reno版本中又针对性的加入了“快速重传(Fast retransmit)”、“快速恢复(Fast Recovery)”算法,再后来在TCP NewReno中又对“快速恢复”算法进行了改进,近些年又出现了选择性应答( selective acknowledgement,SACK)算法
Tahoe
算法简介 Tahoe算法主要有三个机制去控制数据流和拥塞窗口 慢启动 slow start (SS) 拥塞避免 congestion avoidance (CA) 快速重传 fast retransmit(FS) 算法思想 慢启动阶段,拥塞窗口(congestion window)随着确认的到来指数增长,直到到阈值(ssthresh) 接着进入拥塞避免阶段,Cwnd每隔RTT线性增加1个单位 如果连续检测到3个丢包时间事件,不等重传计时器溢出,马上重传丢失数据,之后进入慢启动阶段
Reno
算法简介 对Tahoe算法进行改进, 加入快速恢复机制 慢启动 slow start (SS) 拥塞避免 congestion avoidance (CA) 快速重传 fast retransmit(FS) 快速恢复 Fast Recovery(FR) 算法思想 慢启动阶段,拥塞窗口(congestion window)随着确认的到来指数增长,直到到达阀值(ssthresh) 接着进入拥塞避免阶段,Cwnd每隔RTT线性增加1个单位 如果连续检测到3个重复的ACK,不等重传计时器溢出,马上重传丢失数据 如果连续检测到3个重复的ACK, 或者重传计时器溢出,Reno会认为有数据报遗失了, 并且认定网络发生拥塞。Reno 会把ssthresh 设为目前Cwnd的一半, 但并不会回到SS的状态,而是设定Cwnd为ssthresh,之后进入拥塞避免状态
New Reno 算法
算法简介 New Reno是基于窗口反馈机制的端到端拥塞控制算法 算法思想 TCP Newreno利用一种Partial ACK包在快速恢复阶段触发数据包的重传。 Partial ACK包是指当一个窗口出现多个分组丢失时, 确认了部分发送分组的重传分组的ACK包。数据传输过程中有多个分组丢失后, Newreno在快速恢复阶段每隔1个往返延迟(RTT)重传1个丢失的分组, 直到拥塞窗口的所有丢失分组都被重传。当在快速恢复阶段接收到第1个Partial ACK时, 将重传计时器复位
sack算法
选择性应答 算法简介 基于Reno算法的改进 算法思想 当检测到拥塞后, 不用重传从数据丢失时到检测出数据丢失时发送的全部数据, 而是对这些数据包进行有选择的确认和重传,从而避免不必要的重传,减少时延,提高网络吞吐量 在收到第二个重复的ACK包时,进入快速恢复阶段 设置一个变量用来估计网络中正在传输的分组数量,只有该变量小于拥塞窗口时,才允许发送分组数据
Fack 算法
基于Sack1算法的修改 引入三个参数 未确认分组中的第一个序号 待发送的第一个分组的序号 接收端收到的最新分组的序号
Vegas
与Reno采用的报文丢失作为拥塞度量不同的是,Vegas采用延迟作为度量度 并且通过比较实际传输速率与期望传输速率之间的差值来预知拥塞的发生 太复杂了自行wiki吧这个。
加密
常见密码学算法
块加密算法
AES
Serpent
流加密算法
RC4
ChaCha20
哈希算法
MD5
sha1
sha256
sha512
ripemd 160
poly1305
消息验证码
HMAC-sha256
AEAD
秘钥交换
DH
ECDH
RSA
PFS方式的(DHE,ECDHE)
公钥加密
RSA
rabin-williams
数字签名
RSA
DSA
ECDSA
密码衍生函数
TLS-12-PRF
bcrypto
scrypto
pbkdf2
随机数生成器
TLS
按组件分
在TLS中,这5类算法组合在一起,称为一个CipherSuite: authentication (认证算法) encryption (加密算法 ) message authentication code (消息认证码算法 简称MAC) key exchange (密钥交换算法) key derivation function (密钥衍生算法)
对称加密传输组件
认证秘钥协商组件
密钥扩展组件
协议分层
对称加密传输:record
认证秘钥协商:handshake协议
辅助协议
Changecipher spec协议
用来通知对端从handshake切换到record协议(有点冗余,在TLS1.3里面已经被删掉了)
通知各种返回码:Alert协议
把http,smtp等的数据流传入record层做处理并传输:application data协议
步骤
分片,逆向是重组
生成序列号,为每个数据块生成唯一编号,防止被重放或被重排序
压缩,可选步骤,使用握手协议协商出的压缩算法做压缩
加密,使用握手协议协商出来的key做加密/解密
算HMAC,对数据计算HMAC,并且验证收到的数据包的HMAC正确性
发给tcp/ip,把数据发送给 TCP/IP 做传输(或其它ipc机制)。
算法
广度优先查找
深度优先查找
二分查找
归并排序
快速排序
堆排序
树:红黑树、B树:插入、查找、构建
动态规划
encode问题
数据结构
链表
二叉树
单词查找树
栈
队列
向量、数组
Map
线段树
概念
时间复杂度
空间复杂度
Stack和heap区别
Java基础
参考《Effective Java》