面试基础知识整理

119 阅读6分钟

计网知识:

OSI七层模型: 物理层、数据链路层、网络层、传输层、会话层、表示层、应用层

数据单元:

物理层:bit

数据链路层:帧 frame

网络层:数据包 packet

传输层:数据包,TCP 叫 数据段 segment,UDP 叫 数据报 datagram

  1. HTTP协议和HTTPS

参考这个链接

http:超文本传输协议

特点

无连接:每次发送报文都要建立一次连接。

无状态:每一次请求都不会保存之前的状态。

灵活:通过content-type 标记,可以传输任意类型的数据(文本、图片、视频)

简单快速:http协议简单,对服务器的消耗较小

缺点:

无状态: 意味着不会记录任何连接信息,意味着无法记录客户端的信息,后续处理前面的信息需要重传,导致每次连接传输的信息量变大。

不安全:

明文传输,header使用的是明文,暴露信息。如wifi陷阱

队头阻塞:

Http报文分为 请求报文和响应报文

HTTP请求报文的一般格式

img

image.png

HTTP请求方法:

一般有九种:

HTTP1.0: GET、POST、HEAD

HTTP1.1:PUT、PATCH、DELETE、

GET和POST的区别:

HTTP协议 GET请求和POST请求都是基于TCP/IP 协议实现的。使用任意一个都可以实现客户端和服务器的双向交互。

  1. 本质上的区别是 “约定和规范”

GET请求是用来获取服务器资源的,也就是进行查询操作,

POST请求是用来传输实体对象的,也可以用来添加、修改、删除。

按照约定,GET请求是将参数拼加到URL进行参数传递,POST是将参数写入请求正文中传递。

  1. GET方法是请求一般会被缓存。GET方法的参数是放在URL里传递的,URL是有长度限制的,
  2. 回退的刷新不一样,GET方法不会重新提交,POST会把数据再次提交。
  3. GET请求的参数会保存在历史记录里,POST请求的参数不会保留到历史记录里。

总结:GET和POST是HTTP请求中最常用的两种方法,都是基于TCP/IP 协议

常见的HTTP状态码

1xx : 指示信息

2xx:成功

3xx:重定向(重定向是指完成过程需要更多操作)

4xx:客户端错误

5xx:服务端错误

重定向:

重定向就是网络请求的方法转到其他位置(如网页重定向或者域名重定向),重定向分为301永久重定向,和302临时重定向。

HTTP的长连接和短连接

http1.0采用的是 请求-应答 模式,普通模式下每次发送一个信息都要TCP三握手,发送完就要TCP四次挥手,长连接在请求头加上一个keep - alive , 建立一次TCP连接,客户端和服务器的连接持续有效。

1.png

长连接的优点是:

  • 减少服务器内存消耗,因为不需要经常建立和关闭连接
  • 支持管道化
  • 减少网路堵塞
  • 减少了后续请求的响应时间,因为不需要频繁的建立连接

缺点:

  • 长时间保持连接会很浪费服务器资

可以通信完就关闭,或者设置超时时间,

管道化:

HTTP1.1在使用长连接时,可以这样

管道化管理消息是这样,客户端可以不等待回答就继续发送请求,服务端会按照请求顺序响应。

请求1 -> 请求2 -> 请求3 -> 响应1 -> 响应2 -> 响应3

正向代理和反向代理

正向代理:客户端配置需要使用的代理服务器,

多个客户端使用一个代理服务器访问服务端;

用于屏蔽网站,对用户访问进行授权。

1626238781500.jpg

反向代理:

一个客户端对代理服务器,对应多个服务器。

用于服务器的负载均衡、缓存。

1626239283393.jpg

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是有状态

  1. TCP和UDP
  2. TCP三次握手和四次挥手
  3. HashMap原理(红黑树)
  4. Recyclerview的优化原理。

2023-02-20

一共两轮面试

  1. 快速排序,堆排序
  2. 安卓和ios退出桌面,活动周期变化
  3. for 循环,remove a[ i ] ,问怎么变化
  4. 大量需要及时加载数据怎么优化 tableview
  5. 碎片

十大经典排序算法

  1. 冒泡排序

冒泡排序每次比较相邻两个元素大小,把大的放到右边,每一轮排序后,最后位置的元素是最大的。

时间复杂度:O(n ^ 2)

空间复杂度:O(1)

  1. 选择排序

把数组分成两端,每次把未排序的数组里找最大的元素,放到已经排序好的数组的最前端。

时间复杂度:O(n ^ 2)

空间复杂度:O(1)

  1. 插入排序

插入排序把数组看成有序序列和无序序列,从头到尾扫描无序序列,每次把选择的元素扫描一遍插入有序序列,最终整个序列是有序序列。

时间复杂度:最好情况 O(n) O(n ^ 2)

空间复杂度:O(1)

  1. 希尔排序
  2. 归并排序

基于分治法,自底向上的迭代,想象如何归并两个有序数组,给两个数组维两个游标,比较两个游标所比的元素,小的填入新数组,因为两个数组都是有序的。

时间复杂度:稳定 O( nlogn)

空间复杂度:O(n)

  1. 快速排序

分治想法,每次选择一个基准,把比基准小的元素放到基准左边,把比基准大的放到右边。递归的快速排序左右两个数组。

首先,找一个基准(数组头尾或者中间),设置头指针 i = 1,尾指针 j = n -1 ,让尾指针从后往前找到第一个比基准小的然后和基准交换位置,再让头指针从前往后扫描,找到第一个比基准大的位置,然后交换位置,一直交换到尾指针在头指针前面,说明此时基准左边的都比他小,右边都比他大,此时递归左右两边的数组。

快速排序是冒泡排序的基础上改进的,冒泡是相邻的交换,快速是跳着交换。

时间复杂度:O( nlogn),恶化 O( n ^ 2)

空间复杂度:O( log n )

  1. 堆排序

基于堆,堆是一种完全二叉树,大顶堆就是所有节点的值大于等于子节点。

将待排序序列构造成一个大顶堆,此时,整个序列的最大值就是堆顶的根节点。将其与末尾元素进行交换,此时末尾就为最大值。然后将剩余n-1个元素重新构造成一个堆,这样会得到n个元素的次小值。如此反复执行,便能得到一个有序序列了

时间复杂度:O( nlogn),

空间复杂度:O( 1 )