计网知识:
OSI七层模型: 物理层、数据链路层、网络层、传输层、会话层、表示层、应用层
数据单元:
物理层:bit
数据链路层:帧 frame
网络层:数据包 packet
传输层:数据包,TCP 叫 数据段 segment,UDP 叫 数据报 datagram
- HTTP协议和HTTPS
参考这个链接
http:超文本传输协议
特点
无连接:每次发送报文都要建立一次连接。
无状态:每一次请求都不会保存之前的状态。
灵活:通过content-type 标记,可以传输任意类型的数据(文本、图片、视频)
简单快速:http协议简单,对服务器的消耗较小
缺点:
无状态: 意味着不会记录任何连接信息,意味着无法记录客户端的信息,后续处理前面的信息需要重传,导致每次连接传输的信息量变大。
不安全:
明文传输,header使用的是明文,暴露信息。如wifi陷阱
队头阻塞:
Http报文分为 请求报文和响应报文
HTTP请求报文的一般格式
HTTP请求方法:
一般有九种:
HTTP1.0: GET、POST、HEAD
HTTP1.1:PUT、PATCH、DELETE、
GET和POST的区别:
HTTP协议 GET请求和POST请求都是基于TCP/IP 协议实现的。使用任意一个都可以实现客户端和服务器的双向交互。
- 本质上的区别是 “约定和规范”
GET请求是用来获取服务器资源的,也就是进行查询操作,
POST请求是用来传输实体对象的,也可以用来添加、修改、删除。
按照约定,GET请求是将参数拼加到URL进行参数传递,POST是将参数写入请求正文中传递。
- GET方法是请求一般会被缓存。GET方法的参数是放在URL里传递的,URL是有长度限制的,
- 回退的刷新不一样,GET方法不会重新提交,POST会把数据再次提交。
- GET请求的参数会保存在历史记录里,POST请求的参数不会保留到历史记录里。
总结:GET和POST是HTTP请求中最常用的两种方法,都是基于TCP/IP 协议
常见的HTTP状态码
1xx : 指示信息
2xx:成功
3xx:重定向(重定向是指完成过程需要更多操作)
4xx:客户端错误
5xx:服务端错误
重定向:
重定向就是网络请求的方法转到其他位置(如网页重定向或者域名重定向),重定向分为301永久重定向,和302临时重定向。
HTTP的长连接和短连接
http1.0采用的是 请求-应答 模式,普通模式下每次发送一个信息都要TCP三握手,发送完就要TCP四次挥手,长连接在请求头加上一个keep - alive , 建立一次TCP连接,客户端和服务器的连接持续有效。
长连接的优点是:
- 减少服务器内存消耗,因为不需要经常建立和关闭连接
- 支持管道化
- 减少网路堵塞
- 减少了后续请求的响应时间,因为不需要频繁的建立连接
缺点:
- 长时间保持连接会很浪费服务器资
可以通信完就关闭,或者设置超时时间,
管道化:
HTTP1.1在使用长连接时,可以这样
管道化管理消息是这样,客户端可以不等待回答就继续发送请求,服务端会按照请求顺序响应。
请求1 -> 请求2 -> 请求3 -> 响应1 -> 响应2 -> 响应3
正向代理和反向代理
正向代理:客户端配置需要使用的代理服务器,
多个客户端使用一个代理服务器访问服务端;
用于屏蔽网站,对用户访问进行授权。
反向代理:
一个客户端对代理服务器,对应多个服务器。
用于服务器的负载均衡、缓存。
HTTPS
HTTPS是HTTP+SSL/ TLS
- HTTP是
明文传输,不安全的,HTTPS是加密传输,安全的多 - HTTP标准端口是
80,HTTPS标准端口是443 - HTTP不用认证证书
免费,HTTPS需要认证证书要钱 连接方式不同,HTTP三次握手,HTTPS中TLS1.2版本7次,TLS1.3版本6次- HTTP在OSI网络模型中是在
应用层,而HTTPS的TLS是在传输层 - HTTP是
无状态的,HTTPS是有状态的
- TCP和UDP
- TCP三次握手和四次挥手
- HashMap原理(红黑树)
- Recyclerview的优化原理。
2023-02-20
一共两轮面试
- 快速排序,堆排序
- 安卓和ios退出桌面,活动周期变化
- for 循环,remove a[ i ] ,问怎么变化
- 大量需要及时加载数据怎么优化 tableview
- 碎片
十大经典排序算法
-
冒泡排序
冒泡排序每次比较相邻两个元素大小,把大的放到右边,每一轮排序后,最后位置的元素是最大的。
时间复杂度:O(n ^ 2)
空间复杂度:O(1)
- 选择排序
把数组分成两端,每次把未排序的数组里找最大的元素,放到已经排序好的数组的最前端。
时间复杂度:O(n ^ 2)
空间复杂度:O(1)
- 插入排序
插入排序把数组看成有序序列和无序序列,从头到尾扫描无序序列,每次把选择的元素扫描一遍插入有序序列,最终整个序列是有序序列。
时间复杂度:最好情况 O(n) O(n ^ 2)
空间复杂度:O(1)
- 希尔排序
- 归并排序
基于分治法,自底向上的迭代,想象如何归并两个有序数组,给两个数组维两个游标,比较两个游标所比的元素,小的填入新数组,因为两个数组都是有序的。
时间复杂度:稳定 O( nlogn)
空间复杂度:O(n)
- 快速排序
分治想法,每次选择一个基准,把比基准小的元素放到基准左边,把比基准大的放到右边。递归的快速排序左右两个数组。
首先,找一个基准(数组头尾或者中间),设置头指针 i = 1,尾指针 j = n -1 ,让尾指针从后往前找到第一个比基准小的然后和基准交换位置,再让头指针从前往后扫描,找到第一个比基准大的位置,然后交换位置,一直交换到尾指针在头指针前面,说明此时基准左边的都比他小,右边都比他大,此时递归左右两边的数组。
快速排序是冒泡排序的基础上改进的,冒泡是相邻的交换,快速是跳着交换。
时间复杂度:O( nlogn),恶化 O( n ^ 2)
空间复杂度:O( log n )
- 堆排序
基于堆,堆是一种完全二叉树,大顶堆就是所有节点的值大于等于子节点。
将待排序序列构造成一个大顶堆,此时,整个序列的最大值就是堆顶的根节点。将其与末尾元素进行交换,此时末尾就为最大值。然后将剩余n-1个元素重新构造成一个堆,这样会得到n个元素的次小值。如此反复执行,便能得到一个有序序列了
时间复杂度:O( nlogn),
空间复杂度:O( 1 )