面试问题清单

1.注重二八法则,做一个高效的worker

重要紧急:英文面试,数据库设计 重要不紧急:算法刷题
不重要紧急:flutter、springboot 不重要不紧急:

答题原则

回答一个问题,首先不是背诵,其次答出逻辑(背景现状解决),最后根据自己知道的做引申/深入

不是去网上复制粘贴,而是回忆出答案之后用自己的话总结陈述一遍

  1. 输入=》大量看弄清细节和综述
  2. 输出=》看着空题目说出自己的答案

不要老师问什么 你就只答什么,如果整场面试老师发言的时间比你还长,那么这场面试成绩一 定不理想。每个面试问题都没有固定的答案。要试着在某个问题的回答上适当 的引申,把老师指引到你擅长的领域,掌握面试中的主动权。但一定要先正面 回答一下老师的问题,再去加以引申,

我说:比如在答事务ACID一致性引到隔离级别,隔离性引到锁机制 持久性引到出错处理;

答数据库的范式引到我课设项目的数据表设计

一、计算机网络

输入URL到返回网页,中间发生了什么?
1.查对应url的IP地址——DNS解析(浏览器缓存,host,本地服务器,递归/迭代)

  1. 2.建立TCP连接
  2. 3.发送HTTP请求——`GET index.html HTTP/1.1`
  3. 4.服务器处理请求(参数,cookies),发回HTML响应
  4. 5.浏览器解析渲染页面(DOM render 回流重绘)
  5. 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报文的组成?

  1. 请求行: 包括方法、URL、协议/版本
  2. 请求头(Header) 包括编码方式等
  3. 请求正文 真正返回的数据等

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上的开销。

协程的特点

  1. 线程的切换由操作系统负责调度,协程由用户自己进行调度,因此减少了上下文切换,提高了效率。
  2. 线程的默认Stack大小是1M,而协程更轻量,接近1K。因此可以在相同的内存中开启更多的协程。
  3. 由于在同一个线程上,因此可以避免竞争关系而使用锁。
  4. 适用于被阻塞的,且需要大量并发的场景。但不适用于大量计算的多线程,遇到此种情况,更好实用线程去解决。

协程的原理

当出现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.黑盒测试和白盒测试的区别是什么?各有哪些常用方法?

黑盒测试——只测试接口输入输出是否正确,不管程序内部结构

  1. 等价类划分法:、边界值分析:、错误推测、因果图法

白盒测试——检查程序源代码和内部逻辑结构,测试内部逻辑正确性

  1. 逻辑覆盖法、基本路径法

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.程序运行时存储空间的布局?各存放什么?

代码段——存放程序执行代码

静态数据区

  1. 数据段——已初始化全局变量、静态变量、常量
  2. BSS段——未初始化的全局变量

动态数据区

  1. 堆区:mallocnew动态分配的内存
  2. 栈区:参数、局部变量(通过栈顶指针+偏移访问

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

十、英文面试

英文自我介绍

  1. Good morning, dear professors! I am honored to be here for your interview. Now, please allow me to give a brief self-introduction.
  2. 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.
  3. 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.
  4. 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.
  5. 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!Thats 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优点