面试题目汇总

一些面试(可能会)遇到的题目,总结整理一下

C++相关

C++内存管理机制

C++内存分为五个区

  • 堆 —— new 申请, delete 释放
  • 栈 —— 局部变量
  • 自由存储区 —— malloc 申请, free 释放
  • 静态区 —— 全局变量和静态变量
  • 常量区 —— 存储不能修改堆常量

JAVA相关

Java的内存管理机制

Java内存同样分为五个区

  • 方法区 —— 全局共享,存放类信息,静态变量, final 常量等,其中还包括运行时常量池
  • 堆区 —— 全局共享,存放对象实例和数组值,new 创建的事物
  • 本地方法栈
  • 程序记数器 —— 线程行号指示器
  • Java虚拟机栈 —— 局部变量

Java面向对象特性

  • 封装 —— 将属性已经操作放在类之中
  • 继承 —— 一个类可以继承父类的特性,
  • 抽象 —— 将一类实体的共同特征提取出来,封装在一个新的类中
  • 多态 —— 传递给父类对象引用不同的子类对象从而表现出不同的行为

List, Set, Map 的区别

  • List 允许重复对象,有序的而且可以有多个null
  • Set 不允许重复对象,只能有一个null且是无序的
  • Map 允许重复对象,每个对象包含一个值一个键,值可以重复但键只能唯一

ArrayList, LinkedList 的区别

  • ArrayList 基于动态数组实现,可以随机访问
  • LinkedList 基于双向链表实现,只能顺序访问,但可以快速增加删除

Java内存回收机制

JVM内存模型

抽象类和接口的区别

  • 抽象类:extend 关键字,可以有构造器,可以用public,protected或者private修饰
  • 接口: implement 关键字,不可以有构造器,只能用public方法

深拷贝和浅拷贝的区别

  • 浅拷贝赋值引用地址,修改值会影响原来的值
  • 深拷贝会在堆中新建对象,修改不会影响原来值

计算机网络

osi七层模型

应用层 表示层 会话层 传输层 网络层 链路层 物理层

五层模型

应用层 传输层 网络层 数据链路层 物理层

四层模型

应用层 传输层 网际层 网络接口层

三次握手

三次握手是指TCP建立链接的过程

第一次握手由客户端向服务端发送带有SYN = 1的数据报文, 此时客户端知道自己发送成功,服务端知道对方发送成功,自己接收成功。

第二次握手由服务端向客户端发送带有ACK = 1,SYN = 1的数据报文,此时客户端知道自己发送接收成功,对方发送接收成功, 服务端知道自己发送接收成功,对方发送成功。

第三次握手由客户端向服务端发送待用ACK的数据报文,此时客户端知道自己发送接收成功,对方发送接收成功,服务端知道自己发送接收成功,对方发送接收成功。

四次挥手

四次挥手是TCP协议断开链接的过程

第一次挥手由客户端向服务端发送断开链接的请求,发送一个带有fin的数据报文。

第二次挥手由服务端接收到客户端发送的请求后,发送一个带ACK的数据报文来表示他已经知道客户端的请求。

第三次挥手由服务端处理完数据后并关闭与客户端之间的链接后,向客户端发送一个带FIN的数据报文声明他已经处理完断开链接所需要处理的数据。

第四次挥手由客户端向服务端发送一个带有ACK的数据报文,声明客户端知道链接已断开。

UDP和TCP的区别

  • tcp面向链接而udp面向无链接
  • tcp保证准确性而udp不保证准确性
  • tcp只支持一对一,而udp支持一对多,多对一,一对一,多对多
  • tcp面向字节而udp面向报文
  • tcp有拥塞控制而udp没有

tcp确认机制

超时重传,流量控制,拥塞控制,校验码,按序号发送接收

tcp用超时重传来保证准确性,即已发送的报文在规定时间内没有答复,则重新发送

tcp拥塞控制

  • 慢开始 —— cwnd 一开始为1,每次接收成功后翻倍,直到达到 ssthresh(慢开始门限)后每次加一
  • 拥塞避免 —— 当 cwnd >= ssthresh 时,进入拥塞避免,每个轮次只将 cwnd 加一
  • 快重传 & 快恢复 —— 当连续收到三次重复报文的确认信号后,立刻重传下一段报文

输入url后的过程

  • DNS将输入域名解析为IP地址
  • 客户端向服务端发送建立TCP请求的过程
  • 客户端向服务端发送Http请求
  • 服务端向客户端响应Http请求
  • 客户端将得到的HTML代码解析并渲染给用户

URL 各部分的含义

三个部分:

  • 协议名: http: https: ftp:
  • 主机名: IP地址
  • 路径名及文件名: / / / 之类的

GET和POST的区别

Get用户获取报文,而Post则用于传输报文

Get可以保存为书签,可缓存,Post不可以保存为书签,不可缓存

Get幂等,post不幂等

udp能否实现和tcp一样的效果

模拟和tcp一样的结果,加入确认,超时重传等机制

Http特点

  • 支持客户/服务模式
  • 简单快速——客户端向服务端请求服务时只需传送请求方法和路径
  • 灵活——可以传输任意数据类型
  • 无链接——每次请求结束后便会断开链接因此是无链接的,但通过Cookie和Session可以记录http联机记录
  • 无状态——对处理事务没有记忆,如需处理之前已传输过的数据,只能重新传送

Cookie和Session

由于Http是无状态的协议,所以在Http1.1中引入Cookie,用Cookie来保存一部分的用户信息,例如登陆状态等,将其保存在本地浏览器中并在下一次链接过程中传输过去。而Session则是将用户信息存储在服务端,这样更安全。用户输入用户名及密码,可从数据库中获取。

两者区别

  • Cookie存储用户信息在本地浏览器,不安全
  • 对于大型的网站,若使用Session来存储会造成巨大开销
  • Cookie只能存储ASCII码的数据,而Session可以存储复杂的数据类型

SSL

公钥和私钥的区别

私钥算法:即对称密钥加密,发送端加密和接收端揭密用的是同一个密钥,这样速度会比较快,但这样可能不是很安全。

公钥算法:即非对称密钥加密,发送端加密和接收端揭密用的不是同一个密钥,接收端向发送端发送公钥,然后发送端使用公钥进行加密,接收端接收到后用私钥进行揭密。使用公钥虽然更加安全,但这样效率较低。

Https采用的加密方式:

结合对称和非对称加密方式: 用非对称密钥加密的方式传输密钥,之后进行对称密钥加密

CA

第三方数字证书认证机构,是服务端和客户端都认可的第三方机构,增加数字签名以避免被其他第三方窃取公钥

Http报文格式

  • 请求行 —— 请求方法,URL,协议
  • 请求头
  • 请求正文

Http相应报文格式

  • 状态行 —— 版本协议,状态码,描述
  • 响应头
  • 响应正文

状态码类型

  • 1xx发送成功
  • 2xx请求处理成功
  • 3xx请求重定向
  • 4xx客户端错误
  • 5xx服务端错误

常见状态码

  • 200 OK —— 客户端请求成功
  • 301 —— 资源被永久转移到其他url
  • 302 —— 临时跳转
  • 400 Bad Request —— 客户端请求有语法错误
  • 402 Unauthorized —— 请求未经授权
  • 404 —— 请求资源不存在,url输入错误
  • 500 —— 服务器内部错误
  • 503 Server Unavailable —— 服务端暂时不可用

Http和Https的区别

  • http 明文传输,不安全
  • http 不验证通信方的身份,可能会遭到伪装
  • http 无法证明报文的完整性,报文可能受篡改
  • 而 https 通过加密,认证和完整性保护避免了这些情况的发生

Http建立链接过程

Https建立链接过程

长链接&短链接

  • 短链接是指每次服务端响应http请求后,就断开链接,这样在请求较多的情况下会比较耗时
  • 长链接则是不断开链接,保持链接方便不断处理http请求

http 1.0, http 1.1 和 http 2.0 区别


操作系统

进程与线程的区别

进程是资源分配的最小单位,线程是CPU分配的最小单位,一个线程只能属于一个进程,一个进程包含多个线程,拥有资源,调度,开销,通信。

进程的通信方式

  • 管道 —— 分为命名进程和非命名进程,非命名进程只允许父子进程间的通信,命名进程(FIFO)则允许非父子进程通信,管道只允许单程流通,因此他是半双工的
  • 消息队列 —— 在一个进程创建消息队列,一个进程写一个进程读,这种方式类似于文件创建的方式,因此当消息队列未读出就接入下一个进程时,很容易读到之前进程的消息
  • 信号量 —— 只能用于同步
  • 共享区域 —— 开辟一块的共享区域用于进程读写

进程状态

  • 就绪模式 —— 该进程未占用了初CPU资源意外的所以资源,等待CPU分配资源
  • 运行状态 —— 该进程正在占用CPU资源,处于此状态的进程数小于等于CPU数
  • 阻塞状态 —— 该进程正在占用CPU资源,但在等待某种条件以继续,或者放弃CPU资源回到就绪状态

管道通信底层实现

进程创建开销为什么比线程高

线程共享那些资源,线程都有自己的栈吗

堆和栈的区别

  • 堆用于存储实例,栈用于存储局部变量
  • 每个线程都有一个栈,而多个线程公用一个堆
  • 栈内存存放变量生命周期结束就会释放,而堆内存则是通过垃圾回收机制处理
  • 效率:

死锁及解决方法

银行家算法

虚拟内存

并发与并行的区别

悲观锁和乐观锁

进程的内存布局,哪些是线程共享的

虚拟内存的作用,地址空间的概念,指针能不能访问0x0,如何在进程中直接操作物理地址

用户态和内核态

异常控制流

LRU

中断

直接寻址和间接寻址


数据结构

八大排序算法

直接插入排序O(N^2)稳定最好O(N) 最坏O(N^2)
希尔排序O(N (logN)^2)不稳定最好O(N) 最坏O(N(logN)^2)
选择排序O(N^2)不稳定永远都是O(N^2)
堆排序O(N (logN))稳定好坏都是O(N (logN))
冒泡排序O(N^2)稳定最好O(N) 最坏O(N^2)
快排O(N (logN))不稳定最好O(N) 最坏O(N (logN))
分组排序O(N (logN))不稳定好坏都是O(N (logN))
基数排序O(kN)稳定好坏都是O(kN)

堆与栈的区别

第k大的数 一个元素添加进去堆调整的复杂度以及排序的复杂度

数组,链表,hash表,二叉树区别:查找,删除,插入时间复杂度分析

数组O(N)O(N)O(1)
链表O(N)O(1)O(N)
hash表O(1)O(1)O(1)
二叉树O(logN)O(logN)O(logN)

哈希表解决冲突的方式

  • 线性探测法
  • 链表法

Huffman 树

Huffman 树是一种编码方式,建树过程是先将需要编码的数据按出现频率从小到大的顺序排列,然后将值最小的两个节点建树并将其和设为一个新的节点,递归进行直到只剩下一个节点便可得到 Huffman 树


算法

链表去除重复数据

知道两个有序数组中的中位数,如何找他们两个数组合并后得到的中位数

根据二叉树的前序和后序序列能恢复出多少棵树

数组中找最大最小数

一般情况:分开去找 —— n-1 + n-1 = 2n-2

优化情况:两个两个地找 —— 3n/2 – 2 —— 每两个两个进行比较,期中大的和max进行比较,小的和min进行比较

数组中第i小的数

一般情况:排序,找第i个位置的数

优化:类似快排的算法,先找一个哨兵k,将小于他的放在左边,大于他的放在右边,若此时k>i,只需要在左边再找i,若k<i, 则需要在右边进行找i-k的位置,递归寻找,平均可以达到O(n)

N叉树第K层节点数量

翻转二叉树的方法

两栈实现一队列

数据库

自旋锁和互斥锁

B树和B+树

事务四特性

ACID

  • A:原子性 —— 事务是不可分割的最小单位,操作或者全部提交成功或者失败全部回滚
  • C:一致性 —— 数据库在事务执行前后保持一致性
  • I:隔离性 —— 在事务最终提交前,对其他事务是不可见对
  • D:持久性 —— 事务提交后,所做对修改便会永久保存到数据库中

Git

git rebase git merge 的区别

IOS

app运行的五个周期

  • 未运行
  • 未激活
  • 激活
  • 后台
  • 挂起

发表评论

邮箱地址不会被公开。 必填项已用*标注