Android面试从新手到架构师,一篇解析就够(网络、算法、Java、Android通信、系统、优化(2)

  • 应用层:负责处理特定的应用程序细节,如 HTTP、FTP、DNS

  • 运输层:为两台主机提供端到端的基础通信,如 TCP、UDP

  • 网络层:控制分组传输、路由选择等,如 IP

  • 链路层:操作系统设备驱动程序、网卡相关接口

UDP
  • UDP 头结构:来源端口、目的端口、长度域、校验和

  • 特点:不可靠、无序、面向报文、速度快、轻量

  • 适用场景:适用于即时通讯、视频通话等

  • 应用:DHCP、DNS、QUCI、VXLAN、GTP-U、TFTP、SNMP

TCP
  • TCP 头结构:来源端口、目的端口、序号、确认序号、SYN/ACK 等状态位、窗口大小、校验和、紧急指针

  • 特点:面向字节流、有拥塞和流量控制、可靠、有序、速度慢、较重量,通过滑动窗口实现流量控制、用塞控制

  • 适用场景:文件传输、浏览器等

  • 应用:HTTP、HTTPS、RTMP、FTP、SMTP、POP3

  • 三次握手:

1. C->S:SYN,seq=x(你能听到吗?)2. S->C:SYN,seq=y,ack=x+1(我能听到,你能听到吗?)3. C->S:ACK,seq=x+1,ack=y+1(我能听到,开始吧)两方都要能确保:我说的话,你能听到;你说的话,我能听到。所以需要三次握手

  • 四次挥手:

1. C->S:FIN,seq=p(我说完了)2. S->C:ACK,ack=p+1(我知道了,等一下,我可能还没说完)3. S->C:FIN,seq=q,ACK,ack=p+1(我也说完了)4. C->S:ACK,ack=q+1(我知道了,结束吧)S 收到 C 结束的消息后 S 可能还没说完,没法立即回复结束标示,只能等说完后再告诉 C :我说完了

HTTP
  • 超文本传输协议,明文传输,默认 80 端口

  • POST 和 GET:Get 参数放在 url 中;Post 参数放在 request Body 中

  • 访问网页过程:DNS 域名解析、TCP 三次握手建立连接、发起 HTTP 请求

HTTPS
  • 默认 443 端口,使用 SSL 协议对 HTTP 传输数据进行了加密,安全

  • 加密过程:Client/Server 通过非对称加密生成密钥,然后用这个密钥去对称加密传输数据

算法:数据结构、常用算法

============

数据结构
  • 数组、链表

  • 栈、队列

  • 散列表

  • 树、堆、图

常用算法
  • 排序

  • 双指针、滑动窗口、字符串

  • 递归、分治、二分

  • 回溯、贪心、动态规划

Java 基础:StringBuilder、泛型擦除、Exception、IO、容器

==========================================

StringBuilder
  • StringBuffer 线程安全,StringBuilder 线程不安全

  • +实际上是用 StringBuilder 来实现的,所以非循环体可以直接用 +,循环体不行,因为会频繁创建 StringBuilder

  • String.concat 实质是 new String ,效率也低,耗时排序:StringBuilder < StringBuffer < concat < +

泛型擦除
  • 修饰成员变量等类结构相关的泛型不会被擦除

  • 容器类泛型会被擦除

Exception 和 Error
  • Exception 和 Error 都继承自 Throwable

  • Error 大部分是指不可恢复的错误状态,比如 OOM,所以也不需要捕获

  • Exception 分为 CheckedException 和 UnCheckedException

  • CheckedException:必须显式捕获,受编译器检查,比如 io 操作

  • UnCheckedException:不用显示捕获,比如空指针、数组越界等

IO 、 NIO、 OKIO
  • IO 是面向流的,一次一个字节的处理,NIO 是面向缓冲区的,一次产生或消费一个数据块

  • IO 是阻塞的,NIO 是非阻塞的

  • NIO 支持内存映射方式

  • okio 相比 io 和 nio,api 更简单易用

  • okio 支持超时机制

  • okio 引入 ByteString 空间换时间提高性能

  • okio 采用 segment 机制进行内存共享,节省 copy 时间消耗

ArrayList、LinkedList
  • ArrayList

  • 基于数组实现,查找快:o(1),增删慢:o(n)

  • 初始容量为10,扩容通过 System.arrayCopy 方法

  • LinkedList

  • 基于双向链表实现,查找慢:o(n),增删快:o(1)

  • 封装了队列和栈的调用

HashMap 、HashTable、HashSet
  • HashMap(允许 key/value 为 null)

  • 基于数组和单向链表实现,数组是 HashMap 的主体;链表是为解决哈希冲突而存在的,存放的是key和value结合的实体

  • 数组索引通过 key.hashCode(还会二次 hash) 得到,在链表上通过 key.equals 索引

  • 哈希冲突落在同一个桶中时,直接放在链表头部(java1.8后放到尾部)

  • JAVA 8 中链表数量大于 8 时会转为红黑树存储,查找时间由 O(n) 变为 O(logn)

  • 数组长度总是2的n次方:这样就能通过位运算实现取余,从而让 index 能落在数组长度范围内

  • 加载因子(默认0.75)表示添加到多少填充比时进行扩容,填充比大:链表较长,查找慢;填充比小:链表短,查找快

  • 扩容时直接创建原数组两倍的长度,然后将原有对象再进行hash找到新的index,重新放

  • HashTable(不允许 key/value 为 null)

  • 数据结构和 HashMap 一样

  • 线程安全

  • HashSet

  • 基于 HashMap 实现,元素就是 HashMap 的 key,Value 传入了一个固定值

ArrayMap、SparseArray
  • ArrayMap

  • 基于两个数组实现,一个存放 hash;一个存放键值对

  • 存放 hash 的数组是有序的,查找时使用二分法查找

  • 发生哈希冲突时键值对数组里连续存放,查找时也是通过 key.equals索引,找不到时先向后再向前遍历相同hash值的键值对数组

  • 扩容时不像 HashMap 直接 double,内存利用率高;也不需要重建哈希表,只需要调用 system.arraycopy 数组拷贝,性能较高

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值