面试问题清单
1.注重二八法则,做一个高效的worker
重要紧急:英文面试,数据库设计 | 重要不紧急:算法刷题 |
---|---|
不重要紧急:flutter、springboot | 不重要不紧急: |
答题原则
回答一个问题,首先不是背诵,其次答出逻辑(背景现状解决),最后根据自己知道的做引申/深入
不是去网上复制粘贴,而是回忆出答案之后用自己的话总结陈述一遍
输入=》大量看弄清细节和综述
输出=》看着空题目说出自己的答案
不要老师问什么 你就只答什么,如果整场面试老师发言的时间比你还长,那么这场面试成绩一 定不理想。每个面试问题都没有固定的答案。要试着在某个问题的回答上适当 的引申,把老师指引到你擅长的领域,掌握面试中的主动权。但一定要先正面 回答一下老师的问题,再去加以引申,
我说:比如在答事务ACID一致性引到隔离级别,隔离性引到锁机制 持久性引到出错处理;
答数据库的范式引到我课设项目的数据表设计
一、计算机网络
输入URL到返回网页,中间发生了什么?
1.查对应url的IP地址——DNS解析(浏览器缓存,host,本地服务器,递归/迭代)
2.建立TCP连接
3.发送HTTP请求——`GET index.html HTTP/1.1`
4.服务器处理请求(参数,cookies),发回HTML响应
5.浏览器解析渲染页面(DOM树 render树 回流重绘)
6.关闭连接
说一下网络七层结构?分别做什么?
应用层——应用程序提供服务
表示层——编解码,数据加密解密
会话层——管理用户会话
传输层——端到端的连接,流量拥塞控制
网络层——路由、IP寻址
数据链路层——相邻节点间的通信,介质访问及链路管理
物理层——物理信道上比特流传输
TCP
1.三次握手的流程,细节?
请求-确认(分配缓存)-确认 , seq ack序号
2.四次挥手的流程?
a终止-确认 - b终止-确认,
established-FINwait1-FINwait2-TIMEwait-CLOSED
3.TCP和UDP的区别,根据特点分别适用场景
连接/可靠性/实时性
TCP:HTTP、FTP 、金融(安全性、准确性)
UDP:音视频会议,DNS(高效,准确率稍低)
4.TCP如何保证数据无差错、不丢失、不重复且有序的?有哪些机制来保证?
校验、序号、确认、重传等机制
5.TCP为什么要设置缓存?
发送缓存:已发出但未收到确认的,应用程序送来但未发出的
接收缓存:接收到但未按序到达的,尚未被应用程序读取的
6.TCP报文中序号、确认号、确认位、同步位、终止位分别的含义用处?
seq数据起始字节,ack期望的开始字节,ACK,SYN 2/3, FIN 2/4
7.流量控制:滑动窗口
8.TCP的拥塞控制机制是怎样的?
维护拥塞窗口,慢开始-(到达门限)-拥塞避免-(超时)-从0开始
9.超时重传机制——快重传
让发送方尽快重传而不是等计时器超时, 因此接收方收到时序报文段立即发重复确认,连续收到3个重复确认就立即重传
扩展问题
- 什么是SQL注入?XSS攻击?DDOS攻击?
SQL注入:把sql语句放入web请求参数中,使服务器执行恶意sql命令
XSS攻击:攻击者在web页面中插入恶意script代码,攻击用户信息
DDos分布式拒绝服务:各地ip发送大量请求但不连接
- 什么是SYN洪泛攻击(三次握手的弊端)?
SYN是DDOS的一种,攻击方大量发送TCP连接请求却不应答,导致服务器处于半连接状态,一直分配内存资源,最后服务器宕机
- 为什么采用三次而不是两次握手?
服务端确认可能会丢失,需要第三次来告诉服务端,否则半连接浪费资源
- 如果已经建立了连接,但是客户端故障了,这条连接怎么办?
服务端不会一直等下去,保活计时器一直没收到数据两小时后发送探测报文段,没响应就关闭连接
- 为什么连接三次握手,关闭却是四次?
建立连接时,SYN+ACK在同一报文就向客户端发送
关闭连接时,由于服务端有没发送完的数据,因此要先发ACK,待服务端报文都发送完后再向客户端发FIN报文, 因此四次
- 为什么TIME_WAIT状态需要经过2MSL(最大报文段生存时间)才能返回到CLOSE?
1)客户端需要确保自己的ACK被接受,在2MSL时间内,如果客户端没有正确收到ACK,则会持续发FIN报文;
2)确保本次连接的所有报文段都已发送完毕
HTTP
1.HTTP各状态码分别表示什么?
2xx success ; 3xx redirect; 4xx Client-error; 5xx Server-error
2.HTTP是无状态协议,如何保存用户状态?(session和cookie的区别)
基于Session:服务端存状态信息,客户端请求带上SessionID,服务器得以识别状态 安全性更高
基于Cookie:客户端存状态信息,每次HTTP请求带上信息 额外消耗流量
3.HTTP报文的组成?
- 请求行: 包括方法、URL、协议/版本
- 请求头(Header) 包括编码方式等
- 请求正文 真正返回的数据等
4.HTTP和HTTPS的区别?
HTTP是明文传输不安全
HTTPS添加了加密-认证机制,即HTTP+SSL;需要申请数字证书,
发起HTTPS请求后传送公钥,客户端服务端双方用私钥加密解密信息
IP
0.有哪些路由协议?
RIP:距离向量路由算法,相邻节点交换信息,16不可达,慢收敛
OSPF:链路更新时,泛洪方式交换路由状态
1.子网掩码,默认网关的作用是什么?
和ip地址做与运算,区分ip是否在同一网段上
本地路由表找不到就把数据包发给默认网关
2.说说IP地址的分类?
从二进制0 10 110依次开头为ABC类,主机号占位越来越少
3.有哪些特殊的IP地址?
本网络地址/广播地址
本机测试地址 127.0.0.1 路由表默认地址0.0.0.0
4.IP层内部有什么协议?
ICMP协议,在主机路由器之间传递控制消息
DHCP协议,给网络中主机动态分配ip地址
NAT协议公私ip转换
IGMP实现组播(D类地址)
低2层
0.说说奈奎斯特准则和香农定理?
都和信道带宽W有关,奈适用于无噪声,香农有噪声理想信道(信噪比)
1.频分复用?时分复用?码分复用的区别?
时分复用:帧分为时隙给用户,
频分复用:按频率高低划子信道,
码分:不同用户使用不同码型,即共享频率又共享时间
2.电路交换、报文交换、分组交换的区别?数据报和虚电路?
电路要先建立连接,传输比特流;时延小
报文不建连接,存储转发
分组就是报文再切成小段,速度更快,出错便于处理
- 数据报:使用目的地址,每一分组独立路由,不保证有序
- 虚电路:建立虚电路后,同一虚电路号走同一路由,保证有序到达
3.说说多路载波监听冲突检测CSMA/CD?
争用期2t, 有最小帧长保证检测到冲突, 冲突后有退避算法
4.冲突避免CSMA/CA?
信道预约、虚拟载波监听(携带通信时间,解决隐蔽站问题)
5.数据链路层进行流量控制的方式?
停等协议
滑动窗口机制: GBN(必须按序接受)、 选择重传(接收窗口>1)
6.什么是ARP协议?
知道IP找MAC 广播-回单播-缓存ARP表
二、数据结构与算法
算法和数据结构对应届生是重中之重,多重复
数据结构知识
邻接表邻接矩阵 逆邻接表十字链表 各自特点和应用场景
算法经验
对于应届生,希望他们算法与数据结构等基础扎实、动手实践能力强
1.快速排序 > 冒泡排序 >归并排序>桶排序
2.二分查找,情境考察很多的ip地址中快速找某个ip地址
3.链表的查找、定位、反转、连接,如何判断有环
琏表常见的操作一定要熟练写出来,“坑”,如很多人不注意边界检查、空链表
4.哈希表,哈希冲突的检测、让面试者写一个哈希插入函数
5.红黑树(TreeMap)、B+树B树 ,复杂度、插入删除操作
6.动态规划和分治的区别是什么?
7.DFS和BFS各自的特征在哪里?
三、操作系统
0.OS功能目标
1.进程
1.1单位,生命周期
1.2进程和线程的区别?
1.3线程和协程?
协程也就是由用户自行调度的更轻量线程,适用于异步任务
协程的目的就是当出现长时间的I/O操作时,通过让出目前的协程调度,执行下一个任务的方式,来消除ContextSwitch上的开销。
协程的特点
- 线程的切换由操作系统负责调度,协程由用户自己进行调度,因此减少了上下文切换,提高了效率。
- 线程的默认Stack大小是1M,而协程更轻量,接近1K。因此可以在相同的内存中开启更多的协程。
- 由于在同一个线程上,因此可以避免竞争关系而使用锁。
- 适用于被阻塞的,且需要大量并发的场景。但不适用于大量计算的多线程,遇到此种情况,更好实用线程去解决。
协程的原理
当出现IO阻塞的时候,由协程的调度器进行调度,通过将数据流立刻yield掉(主动让出),并且记录当前栈上的数据,阻塞完后立刻再通过线程恢复栈,并把阻塞的结果放到这个线程上去跑,这样看上去好像跟写同步代码没有任何差别,这整个流程可以称为coroutine,而跑在由coroutine
负责调度的线程称为Fiber
。比如Golang里的 go关键字其实就是负责开启一个Fiber
,让func
逻辑跑在上面。
由于协程的暂停完全由程序控制,发生在用户态上;而线程的阻塞状态是由操作系统内核来进行切换,发生在内核态上。
因此,协程的开销远远小于线程的开销,也就没有了ContextSwitch上的开销。
内存
引入虚拟内存空间有什么好处?
四、计组、系统结构
五、软件工程
1.软件工程
把系统化、工程化的方法运用于软件的开发、运行、维护当中
2.软件工程的目的?三要素?
解决软件危机(软件生产跟不上需求) 提高质量(可靠迁移易维护)和开发效率
过程(可复用的框架)、方法(怎么做)、工具
3.软件生命周期or软件开发步骤?
问题定义-可行性分析
软件开发: 需求分析-概要设计-详细设计-编码实现-测试
运行维护
4.软件开发有哪几种模型?哪些适用于面向对象?
1)瀑布模型(包括V模型) 按线性固定次序进行开发,进度慢且不灵活
2)快速原型 先快速开发出原型,用户试用提意见,修改原型直到满足需求
3)增量模型 n个版本即为n个增量,每个增量经历设计编码测试
4)螺旋模型 重视风险分析,适用大型项目
5)喷泉模型 迭代、无缝
敏捷开发: 大项目切成独立运行的小项目,并分别完成
喷泉模型和统一软件过程(RUP)适用于面向对象
5.软件(模块)设计遵循什么原则?
1模块化 2)抽象 3)信息隐藏(数据、方法隐蔽,只提供接口) 4)模块独立(高内聚低耦合)
6.结构化方法和面向对象方法的区别?各自有什么图?
结构化——自顶向下、逐步求精,软件分解为子模块,再分解为小模块
面向对象——基于对象和类间的继承、聚合(a类使用b类的对象)关系来构造系统,而封装性和多态性(同一接口,不同实现)使得程序更灵活、易于重用
结构化 面向对象 功能 数据流图 用例图 数据结构 E-R图 领域模型图 详细设计阶段 系统结构图 协作图、类图
7.什么是内聚性、耦合性,为什么要高内聚低耦合?
耦合:不同模块间的关联程度 内聚:一个模块内部各元素结合的紧密程度
因为各模块相互独立,便于维护、可迁移可重用、可靠性更高、改动成本小
测试
1.软件测试的主要内容?
1)验证——保证软件能实现需求 2)确认——软件以正确的逻辑运行
2.软件测试有哪些常用方法?
静态测试、动态测试 黑盒测试、白盒测试
3.黑盒测试和白盒测试的区别是什么?各有哪些常用方法?
黑盒测试——只测试接口输入输出是否正确,不管程序内部结构
等价类划分法:、边界值分析:、错误推测、因果图法
白盒测试——检查程序源代码和内部逻辑结构,测试内部逻辑正确性
逻辑覆盖法、基本路径法
4.软件测试的过程是怎样的?
1)单元测试 ——对模块进行独立测试
2)集成测试——把模块组装起来进行测试
3)确认测试 是否满足用户要求
4)系统测试(包含压力测试)——在真实运行环境下进行测试
调试是测试之后进行的,目的是确定错误的原因和位置
六、数据库
SQL语言分为哪几种?
数据定义语言create、查询语言select、操纵语言insert、控制语言改权限
SQL中内连接、外连接的区别
内连接即 == ,返回两表中条件相等的记录
外连接返回左右表中的所有记录
如何加快数据库中查询语句的速度?
1)建立索引
2)减少表间关联
3)优化sql语句:少做全表查询,减少load数据,尽量走索引
关系型设计
1.数据库有哪几种约束?如何更好地维护数据库的完整性?
主键约束、外键约束、not NULL、unique、check
尽可能地使用约束
2.数据库中的候选键,主键?函数依赖?
函数依赖:X->Y,X确定必能确定Y,学号->姓名即姓名函数依赖于学号; (学号,性别)->姓名是部分依赖
候选键——几个属性能唯一确定一行,一候选做主键
主属性——候选码当中包含的属性, 主属性非NULL
3.数据库的E-R图是怎样的?
实体、属性、联系
实体间的联系存在一对一、一对多(主键在多那边)、多对多(属性单独成表加外键)
4.说说范式?关系型数据库设计遵循哪几种范式?
范式:就是一张数据表符合的设计标准,123BCNF依次变强。
范式过低,会有数据冗余,出现插入、删除修改异常
1NF:表中每一列的属性不可再分
2NF:非主属性完全依赖于主键而不是主键的一部分
3NF:非主属性只依赖主键,而不依赖于非主键
5.如何达到更高的范式?
模式分解,即拆分表拆出主属性,消除部分依赖(2NF)和传递依赖(3NF)
并发控制
2.数据库事务的ACID性质是什么?
事务:不可分割的一组操作序列,并发控制的基本单位
A原子性:事务是不可分割的最小执行单位,要做全做
C一致性:执行事务前后数据一致,多个事务对该数据的读取结果相同
I隔离性:并发访问时,各事务相互独立
D持久性:事务提交后,其所做修改是持久的,数据库故障结果也不丢失(采用redo undo日志)
3.说说脏读、不可重复读、幻读?
A事务读取了修改后回滚前的无效数据
A事务前后多次读取结果,内容不一致(B在中途修改)
A前后得到结果 数量不一致(B在中途新增了)
4.事务有哪几种隔离级别?
隔离级别 脏读 不可重复读 幻读 Read (读未提交)uncommitted √ √ √ Read committed × √ √ Repeatable read(可重复读) × × √ Serializable(串行化) × × × mysql默认级别为可重复读
5.数据库有哪几种锁?并发控制两种手段?
共享锁(读锁):其它事务此时也能加S锁
排他锁(写锁):其他事务加不了锁
意向锁:都是表级的,拿读写锁之前要先得到意向锁
悲观:假设会冲突,屏蔽一切可能冲突的(适于写多)
乐观:假定不冲突,只在提交时检查数据完整性(读多)
扩展:6.什么是MVCC?怎么实现的?
多版本并发控制,维持一个数据的多个版本
为事务添加时间戳,每次修改保存一个版本,undo日志进行数据还原,使用“快照读”(不用加锁)实现
7.事务中的undo log和redo log分别做什么?(持久性)
undo:系统崩溃时,把尚未commit的数据回滚到开始前的状态
redo:把已经commit的事务重做一遍
索引
1.索引是什么?目的是什么?
索引相当于目录,占一定空间,能提高查询效率
2.索引一定能加快数据库效率吗?
否,数据表在增删改查时,索引也要动态维护耗时间
3.联合索引的最左前缀匹配原则是什么?
查a,ab,abc,索引(a,b,c)能用到, 然而单独查 b c用不到
比如a = 1 and b = 2 and c > 3 and d = 4 如果建立(a,b,c,d)顺序的索引,d是用不到索引的,最好建立(a,b,d,c)的索引则都可以用到
4.索引设计要遵循什么原则?
- 频繁被查询\经常排序\分组的列建索引
- 对text等长字符串要指定前缀长度
- 最左匹配原则
- 用覆盖索引(索引含所有查询条件),不用回表
不适合
- 更新频繁的不适合建索引
- text,image等大字段不适合建索引
5.索引的底层数据结构是怎样的?
1)Hash表——无法范围查询和排序,用时不稳定
2)B+树——树矮用时稳定,故更常用
6.数据库的索引为何使用B+树而不是B树?
1)B+树只有叶子节点存关键字,非叶节点不存数据,树高更低,IO次数更少
2)B+树叶节点用指针顺序链接,支持顺序检索,同时范围查询效率更高
3)B+树每次都到叶结点取关键字,性能稳定
存储过程
存储过程是一个预编译的 SQL 语句,只需要创建一次,以后在该程序中就可以调用多次
触发器
定义在关系表上,由事件驱动的特殊的存储过程
触发器是指一段代码,当触发某个事件时,自动执行这些语句。
视图是什么?使用视图有什么作用?
视图是数据库中存好的查询语句,调用时产生结果集就像一张虚拟表
作用:简化查询;增加安全性 但会降低性能
七、人工智能
http://c.biancheng.net/ml_alg/term.html
https://easyai.tech/ai-knowledge-hub/
传统机器学习理论
深度学习
知道哪些机器学习算法?
读过哪些机器学习相关的论文?
以后想做哪方面的研究/项目?
大数据——数据仓库/中间件
八、编译原理
1.编译有哪些阶段?各阶段进行什么工作?
- 词法分析:输入源程序输出记号流,目的是识别单词(关键字、标识符等)
- 语法分析:输入记号流输出语法树,目的是得到语言结构并以树的形式表示
- 语义分析:根据语义规则对语法树进行静态语义检查,如类型检查
- 中间代码生成:生成的中间代码(三地址码)既接近目标语言,又与具体机器无关的表示
- 代码优化:实质是等价变换,变换前后指令完成相同功能,但时间空间上更高效
- 目标代码生成:生成目标机器代码即汇编语言
预处理-》编译-》汇编-》链接-》装入
2.文法有哪几种?
0型、1型 2型上下文无关文法 3型正规文法
3.DFA和NFA的区别是什么?
确定性:对任一状态和输入符号,唯一地确定了下一状态
NFA可以转换为等价的DFA
4.语法分析有哪些方法?
- 自顶向下分析法,借助LL1文法
- 自底向上分析,借助LR文法
5.语义分析、代码优化借助什么实现?
符号表
流图
九、程序设计
C和C++
1.程序运行时存储空间的布局?各存放什么?
代码段——存放程序执行代码
静态数据区
数据段——已初始化全局变量、静态变量、常量
BSS段——未初始化的全局变量
动态数据区
堆区:malloc、new动态分配的内存
栈区:参数、局部变量(通过栈顶指针+偏移访问
2.你对指针是怎么理解的?
指针就是指向地址的地址,指针所在内存地址里存的值xx就是它所指向内存区域的起始地址;
指针在32位机器中占4字节空间
数组名的本质就是指针
优点:提高效率,动态内存分配 缺点:安全性可读性
3.C++中指针和引用有什么区别?
引用的本质就是变量的一个别名,声明时必须初始化且不能为空
引用不用分配内存区域,i++和指针有区别,ptr+1表示指向的地址向后挪一个单位(如int型就是4字节)
作为参数传递时,都对实参有影响
4.谈谈面向过程和面向对象的区别?
面向过程,强调通过一系列函数的使用对输入进行处理,得到需要的输出
面向对象的重点在于建立一个对象模型也就是类,通过获取对象的状态信息得到输出
C++和JAVA
1.赋值、深拷贝和浅拷贝的区别?
赋值——两个对象指向同一片内存空间
浅拷贝——新对象另外指向堆中新内存空间,新旧对象中的基本数据类型互不影响,但引用数据类型(类、接口、数组)指向同一块内存
深拷贝——堆内新空间,新旧对象所有数据互不影响
2.详细说说面向对象的三个特征?
1)封装:只对外暴露接口,隐藏内部实现机制
2)继承:子类重用父类的代码
3)多态:父类指针指向的子类对象不同,在调用同一个方法时有不同实现
3.JAVA怎么实现多态?
子类重写父类方法,父类引用指向子类对象(向上转型)
4.C++ 多态的实现原理是什么?虚函数虚表是什么?
写法——父类虚函数,子类中重写该函数,向上转型
虚函数:类中用virtual关键字声明的函数
虚表:有虚函数的类维护一张虚表,存放每个虚函数的地址。类的对象都会维护一个指向虚表的虚指针
原理——编译器会为包含虚函数的类和其子类都创建一个虚表,(动态绑定)编译时并不确定具体调用哪个函数,运行时再根据虚表查找虚函数地址,进而调用
5.C++中重载、重写、隐藏的区别
同名函数,参数是否相同——同override否overload
父类该函数是否为虚函数——是 重写,否 隐藏
6.什么是泛型?C++中如何实现泛型?
泛型——操作的数据类型被指定为参数,建立一个模板能使多种数据类型执行相同的代码
C++中通过定义类模板实现泛型, template
十、英文面试
英文自我介绍
Good morning, dear professors! I am honored to be here for your interview. Now, please allow me to give a brief self-introduction.
My name is Jiang Mingjun, twenty years old. Now I am a senior studying in the Computer Science department of BeiJing University of Posts an Telecommunications, BUPT for short, and my major is Computer Science and Technology.
During my college life, I have won the school-level scholarship for two years and passed CET6 smoothly. Besides, I obtained excellent grades in my main courses, such as Operating System and DataBase Design. Apart from the study in books, I also put it into practice. With the guidence of teachers, I have completed several programming projects, which enabled me to apply theory into practice.
Through four years of study and practice at BUPT, I have acquired a systemic knowledge of Computer Science. Being diligent and always eager to learn, I am confident that my solid education background will lay a sound foundation to fulfill my master degree.
This is me, Jiang MingJun, a bright self-motivated guy. And I would be really grateful that you could give me the chance for further study!That’s all. Thank you for listening!
As for my spare time, I become a volunteer in school. After taking part in several activities, I make a lot of friends. And I realize that helpingothers not only needs enthusiasm, but requires patience and persistence. This,I think, also makes sense when doing scientific research.This is ME, ×××,a bright self-motivated guy in front you.
英文问题
2.What would you like to be doing five years after graduation?(在毕业以后5年内你想做些什么?)
3.What is your greatest strength?(你最突出的优点是什么?)
4.whats your postundergrate/master plan?
术语(ML/BigD)
英文介绍毕业设计
十一、毕业设计
简要介绍
涉及技术
Flutter优点
Java Spring优点