2022春招找工作问题整理

2022春招找工作问题整理

  • 继承都有哪几种方式,具体展开讲讲

三种继承方式:也是 public,protected,private
继承的三种方式
当public继承的时候,父类中public类型的成员会被继承到子类的public中去,而父类的protected成员也会被继承到子类的protected中去

当protected继承的时候,父类中无论是public的还是protected的成员都会被继承到子类的protected中去

当private继承的时候,父类中 public 和 protected 的成员都会被继承到子类的private中去

- 指针和数组名的区别

数组:数组是用于储存多个相同类型数据的集合。
指针:指针相当于一个变量,但是它和不同变量不一样,它存放的是其它变量在内存中的地址。
区别

  • 赋值:同类型指针变量可以相互赋值,数组不行,只能一个一个元素的赋值或拷贝
  • 存储方式:数组:数组在内存中是连续存放的,开辟一块连续的内存空间。指针:指针很灵活,它可以指向任意类型的数据。
  • 求sizeof:数组所占存储空间的内存:sizeof(数组名),数组的大小:sizeof(数组名)/sizeof(数据类型)。在32位平台下,无论指针的类型是什么,sizeof(指针名)都是4,在64位平台下,无论指针的类型是什么,sizeof(指针名)都是8。
  • 初始化方式不同。
    - 请你说一说C++和C的区别
    1、C是面向过程的语言,而C++是面向对象的语言
    2、C和C++动态管理内存的方法不一样,C是使用malloc/free函数,而C++除此之外还有new/delete关键字
    3、C++中有引用,而C没有;
    - C++到可执行文件的过程
    编译与链接有四个过程:
    (1)预处理
    (2)编译
    (3)汇编
    (4)链接
    - 请你说一说TCP的三次握手?
    第一次握手:建立连接时,客户端发送syn包(syn=j)到服务器,并进入SYN_SENT状态,等待服务器确认;SYN:同步序列编号(Synchronize Sequence Numbers)。
    第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态;
    第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED(TCP连接成功)状态,完成三次握手。
    - 请你说一下tcp和udp的区别
    1、TCP面向连接(如打电话要先拨号建立连接);UDP是无连接 的,即发送数据之前不需要建立连接
    2、TCP提供可靠的服务。也就是说,通过TCP连接传送的数据,无差错,不丢失,不重复,且按序到达;UDP尽最大努力交付,即不保 证可靠交付
    3、TCP面向字节流,实际上是TCP把数据看成一连串无结构的字节流;UDP是面向报文的,应用层交给UDP多长的报文,UDP就照样发送,即一次发送一个报文。UDP没有拥塞控制,因此网络出现拥塞不会使源主机的发送速率降低(对实时应用很有用,如IP电话,实时视频会议等)
    4、每一条TCP连接只能是点到点的;UDP支持一对一,一对多,多对一和多对多的交互通信
    5、TCP首部开销20字节;UDP的首部开销小,只有8个字节
    6、TCP的逻辑通信信道是全双工的可靠信道,UDP则是不可靠信道
    (10) Struct和class的区别
    ①内部成员变量及成员函数的默认访问权限
    使用struct时,它的成员的访问权限默认是public的,而class的成员默认是private的。
    ②继承关系
    struct的继承默认是public继承,而class的继承默认是private继承
    ③模板中的使用
    class可以用作模板,而struct不能
    总结:当你觉得你要做的更像是一种数据结构集合的话,那么用struct。如果你要做的更像是一种对象的话,那么用class。
    (11) define 和const的联系与区别(编译阶段、安全性、内存占用等)
    联系:它们都是定义常量的一种方法。
    区别:
    define定义的常量没有类型;const定义的常量是有类型的。
    define定义的常量是在预处理阶段进行替换,而const在编译阶段确定它的值。
    const可以定义函数而define不可以。
    define不会进行类型安全检查,而const会进行类型安全检查,安全性更高。
    (13) C++中的static用法和意义
    static的意思是静态的,可以用来修饰变量,函数和类成员。
    变量:被static修饰的变量就是静态变量,它会在程序运行过程中一直存在,会被放在静态存储区。局部静态变量的作用域在函数体中,全局静态变量的作用域在这个文件里。
    函数:被static修饰的函数就是静态函数,静态函数只能在本文件中使用,不能被其他文件调用,也不会和其他文件中的同名函数冲突。
    类:而在类中,被static修饰的成员变量是类静态成员,这个静态成员会被类的多个对象共用。被static修饰的成员函数也属于静态成员,不是属于某个对象的,访问这个静态函数不需要引用对象名,而是通过引用类名来访问。
    (17)解决哈希冲突的方式?
    线性探查。该元素的哈希值对应的桶不能存放元素时,循序往后一一查找,直到找到一个空桶为止,在查找时也一样,当哈希值对应位置上的元素与所要寻找的元素不同时,就往后一一查找,直到找到吻合的元素,或者空桶。
    二次探查。该元素的哈希值对应的桶不能存放元素时,就往后寻找12,22,32,42…i^2个位置。
    双散列函数法。当第一个散列函数发生冲突的时候,使用第二个散列函数进行哈希,作为步长。
    (19) STL中vector的实现
    STL中的vector是封装了动态数组的顺序容器。不过与动态数组不同的是,vector可以根据需要自动扩大容器的大小。具体策略是每次容量不够用时重新申请一块大小为原来容量两倍的内存,将原容器的元素拷贝至新容器,并释放原空间,返回新空间的指针。
    在原来空间不够存储新值时,每次调用push_back方法都会重新分配新的空间以满足新数据的添加操作。如果在程序中频繁进行这种操作,还是比较消耗性能的。
    (20) vector使用的注意点及其原因,频繁对vector调用push_back()对性能的影响和原因。
    如果需要频繁插入,最好先指定vector的大小,因为vector在容器大小不够用的时候会重新申请一块大小为原容器两倍的空间,并将原容器的元素拷贝到新容器中,并释放原空间,这个过程是十分耗时和耗内存的。频繁调用push_back()会使得程序花费很多时间在vector扩容上,会变得很慢。这种情况可以考虑使用list。
    (22) C++中的重载和重写的区别:
    重载(overload)是指函数名相同,参数列表不同的函数实现方法。
    重写(overwide)是指函数名相同,参数列表相同,只有方法体不相同的实现方法。
    (23) C ++内存管理(热门问题)
    在C++中,内存分成5个区,他们分别是堆、栈、全局/静态存储区和常量存储区和代码区。
    栈,在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。
    堆,就是那些由new分配的内存块,他们的释放编译器不去管,由我们的应用程序去控制,一般一个new就要对应一个delete。如果程序员没有释放掉,那么在程序结束后,操作系统会自动回收。
    全局/静态存储区,内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。它主要存放静态数据(局部static变量,全局static变量)、全局变量和常量。
    常量存储区,这是一块比较特殊的存储区,他们里面存放的是常量字符串,不允许修改。
    代码区,存放程序的二进制代码。
    (24) 介绍面向对象的三大特性,并且举例说明每一个。
    面向对象的三大特性是:封装,继承和多态。
    封装隐藏了类的实现细节和成员数据,实现了代码模块化,如类里面的private和public;
    继承使得子类可以复用父类的成员和方法,实现了代码重用;
    多态则是“一个接口,多个实现”,通过父类调用子类的成员,实现了接口重用,如父类的指针指向子类的对象。
    (25) 多态的实现(和下个问题一起回答)
    C++ 多态包括编译时多态和运行时多态,编译时多态体现在函数重载和模板上,运行时多态体现在虚函数上。
    虚函数:在基类的函数前加上virtual关键字,在派生类中重写该函数,运行时将会根据对象的实际类型来调用相应的函数。如果对象类型是派生类,就调用派生类的函数;如果对象类型是基类,就调用基类的函数.
    (35) 介绍C++所有的构造函数
    C++中的构造函数主要有三种类型:默认构造函数、重载构造函数和拷贝构造函数
    默认构造函数是当类没有实现自己的构造函数时,编译器默认提供的一个构造函数。
    重载构造函数也称为一般构造函数,一个类可以有多个重载构造函数,但是需要参数类型或个数不相同。可以在重载构造函数中自定义类的初始化方式。
    拷贝构造函数是在发生对象复制的时候调用的。
    (37) 结构体内存对齐方式和为什么要进行内存对齐?
    因为结构体的成员可以有不同的数据类型,所占的大小也不一样。同时,由于CPU读取数据是按块读取的,内存对齐可以使得CPU一次就可以将所需的数据读进来。
    “”以空间换时间“”
    (38) 内存泄露的定义,如何检测与避免?
    动态分配内存所开辟的空间,在使用完毕后未手动释放,导致一直占据该内存,即为内存泄漏。
    1)类的构造函数和析构函数中new和delete没有配套
    2)在释放对象数组时没有使用delete[],使用了delete
    避免方法:
    malloc/free要配套;将基类的析构函数设为虚函数;
    (49)一个函数或者可执行文件的生成过程或者编译过程是怎样的
    预处理,编译,汇编,链接
    预处理: 对预处理命令进行替换等预处理操作
    编译:代码优化和生成汇编代码
    汇编:将汇编代码转化为机器语言
    链接:将目标文件彼此链接起来
    (50)set,map和vector的插入复杂度
    set,map的插入复杂度就是红黑树的插入复杂度,是log(N)。
    unordered_set,unordered_map的插入复杂度是常数,最坏是O(N).
    vector的插入复杂度是O(N),最坏的情况下(从头插入)就要对所有其他元素进行移动,或者扩容重新拷贝
    (51)定义和声明的区别
    声明是告诉编译器变量的类型和名字,不会为变量分配空间
    定义就是对这个变量和函数进行内存分配和初始化。需要分配空间,同一个变量可以被声明多次,但是只能被定义一次
    (52)typdef和define区别
    #define是预处理命令,在预处理是执行简单的替换,不做正确性的检查
    typedef是在编译时处理的,它是在自己的作用域内给已经存在的类型一个别名

计网相关

(3) 对路由协议的了解与介绍。内部网关协议IGP包括RIP,OSPF,和外部网关协议EGP和BGP.
(4) UDP如何实现可靠传输
因为UDP是无连接的协议,所以在传输层上无法保证可靠传输,要想实现可靠传输,只能从应用层实现。需要实现seq/ack机制,重传机制和窗口确认机制。
就要接收方收到UDP之后回复个确认包,发送方有个机制,收不到确认包就要重新发送,每个包有递增的序号,接收方发现中间丢了包就要发重传请求,当网络太差时候频繁丢包,防止越丢包越重传的恶性循环,要有个发送窗口的限制,发送窗口的大小根据网络传输情况调整,调整算法要有一定自适应性。
(6) TCP和UDP相关的协议与端口号
TCP族的协议有HTTP,HTTPS,SMTP,TelNet,FTP等,UDP族的协议有DNS,DHCP等等。(UDP和D相关)
(7) TCP(UDP,IP)等首部的认识(http请求报文构成)
TCP的头部大致包括:源端口,目的端口,序号,确认号,偏移位,标志位,校验和等等
UDP的头部则包括:源端口,目的端口,长度,校验和。
IP数据包的头部包括:源IP地址,目的IP地址,协议,校验和,总长度等等
(11) TCP的三次握手与四次挥手的详细介绍(TCP连接建立与断开是热门问题)
三次握手
第一次握手:首先client给server发送连接请求报文,在这个报文中,包含了SYN=1,client_seq=任意值i,发送之后处于SYN-SENT状态,这是第一次握手
第二次握手:server端接收到了这个请求,并分配资源,同时给client返回一个ACK报文,这个报文中呢包含了这些字段,标志位SYN和ACK都为1,而小ack为i+1,此时位于SYN-RCVD状态,这是第二次握手
第三次握手:client收到server发来的ACK信息后呢,他会看到server发过来的小ack是i+1,这时他知道了server收到了消息,也给server回一个ACK报文,报文中同样包含了ACK=1这样的消息,同时呢,还包括了client_ack=k+1这样的字段,这样呢三次握手之后,连接就建立了,client进入established(已建立连接)状态
四次挥手断开连接
TCP断开连接通常是由一方主动,一方被动的,这里我们假设client主动,server被动
第一次挥手:当client没有数据要发送给server了,他会给server发送一个FIN报文,告诉server:“我已经没有数据要发给你了,但是你要是还想给我发数据的话,你就接着发,但是你得告诉我你收到我的关闭信息了”,这是第一次挥手,挥手之后client进入FIN_WAIT_1的第一阶段
第二次挥手:当server收到client发来的FIN报文后,告诉client:“我收到你的FIN消息了,但是你等我发完的”此时给client返回一个ACK信息,并且呢ack=seq+1,这是第二次挥手,挥手之后呢server进入CLOSE_WAIT阶段,而client收到之后处于FIN_WAIT_2第二阶段
第三次挥手:当server发完所有数据时,他会给client发送一个FIN报文,告诉client说“我传完数据了,现在要关闭连接了”,然后呢server变成LAST_ACK状态,等着client最后的ACK信息,这是第三次挥手
第四次挥手:当client收到这个FIN报文时,他会对这个消息进行确认,即给server发ACK信息,但是它不相信网络,怕server收不到信息,它会进入TIME_WAIT状态,万一server没收到ACK消息它可以可以重传,而当server收到这个ACK信息后,就正式关闭了tcp连接,处于CLOSED状态,而client等待了2MSL这样长时间后还没等到消息,它知道server已经关闭连接了,于是乎他自己也断开了,这是第四次挥手,这样tcp连接就断开了
(13) 为什么使用三次握手,两次握手可不可以?(重点,热门问题)
如果使用两次握手的话,三次握手中的最后一次缺失,服务器不能确认客户端的接收能力。
举两个例子,第一种是黑客会伪造大量SYN请求发送给服务器,服务器立即确认并建立连接,分配资源,但是这一系列连接并不是真实存在的,这大大浪费了服务器的资源并且阻塞了正常用户的连接,这种也叫SYN洪泛攻击。
第二种是服务器返回给客户端的ACK数据包可能会在传输的过程中丢失,而客户端没有收到该ACK数据包而拒绝接收服务器接下来发送的数据,于是服务器一直在发送,客户端一直在拒绝,形成死锁。
(16) TCP怎么保证可靠性?
(校序重流拥)

校验和
发送的数据包的二进制相加然后取反,目的是检测数据在传输过程中的任何变化。如果收到段的检验和有差错,TCP将丢弃这个报文段和不确认收到此报文段。

确认应答+序列号
TCP给发送的每一个包进行编号,接收方对数据包进行排序,把有序数据传送给应用层。

超时重传
当TCP发出一个段后,它启动一个定时器,等待目的端确认收到这个报文段。如果不能及时收到一个确认,将重发这个报文段。

流量控制
TCP连接的每一方都有固定大小的缓冲空间,TCP的接收端只允许发送端发送接收端缓冲区能接纳的数据。当接收方来不及处理发送方的数据,能提示发送方降低发送的速率,防止包丢失。TCP使用的流量控制协议是可变大小的滑动窗口协议。
接收方有即时窗口(滑动窗口),随ACK报文发送

拥塞控制
当网络拥塞时,减少数据的发送。
发送方有拥塞窗口,发送数据前比对接收方发过来的即使窗口,取小

慢启动、拥塞避免、快速重传、快速恢复
(19) 拥塞控制和流量控制的区别
拥塞控制是防止过多的数据注入到网络中,导致网络发生拥塞;而流量控制是防止发送方一下子发送过多的数据到接收方,导致接收方缓存放不下。两种算法都是对发送方的行为进行控制的。
(23) http的请求方法有哪些?get和post的区别。
HTTP的请求方法包括GET,POST,PUT,DELETE四种基本方法。(四种方法中只有POST不是操作幂等性的)
(27) TCP三次握手时的第一次的seq序号是怎样产生的 (字节提前批)
第一次的序号是随机序号,但也不是完全随机,它是使用一个ISN算法得到的。
seq = C + H (源IP地址,目的IP地址,源端口,目的端口)。其中,C是一个计时器,每隔一段时间值就会变大,H是消息摘要算法,输入是一个四元组(源IP地址,目的IP地址,源端口,目的端口)。
(35) TCP/IP的粘包与避免介绍一下
因为TCP为了减少额外开销,采取的是流式传输,所以接收端在一次接收的时候有可能一次接收多个包。而TCP粘包就是发送方的若干个数据包到达接收方的时候粘成了一个包。多个包首尾相接,无法区分。
导致TCP粘包的原因有三方面:
发送端等待缓冲区满才进行发送,造成粘包
接收方来不及接收缓冲区内的数据,造成粘包
由于TCP协议在发送较小的数据包的时候,会将几个包合成一个包后发送
避免粘包的措施:
通过编程,强制使TCP发生数据传送,不必等到缓冲区满
优化接收方接收数据的过程,使其来得及接收数据包,包括提高接收进程优先级等
设置固定长度的报文或者设置报文头部指示报文的长度。
(39)DNS的工作过程和原理
DNS解析有两种方式:递归查询和迭代查询
递归查询 用户先向本地域名服务器查询,如果本地域名服务器的缓存没有IP地址映射记录,就向根域名服务器查询,根域名服务器就会向顶级域名服务器查询,顶级域名服务器向权限域名服务器查询,查到结果后依次返回。
迭代查询 用户向本地域名服务器查询,如果没有缓存,本地域名服务器会向根域名服务器查询,根域名服务器返回顶级域名服务器的地址,本地域名服务器再向顶级域名服务器查询,得到权限域名服务器的地址,本地域名服务器再向权限域名服务器查询得到结果
(9) B树和B+树的区别(重点)
这都是由于B+树和B具有不同的存储结构所造成的区别,以一个m阶树为例。

关键字的数量不同;B+树中分支结点有m个关键字,其叶子结点也有m个,其关键字只是起到了一个索引的作用,但是B树虽然也有m个子结点,但是其只拥有m-1个关键字。
存储的位置不同;B+树中的数据都存储在叶子结点上,也就是其所有叶子结点的数据组合起来就是完整的数据,但是B树的数据存储在每一个结点中,并不仅仅存储在叶子结点上。
分支结点的构造不同;B+树的分支结点仅仅存储着关键字信息和儿子的指针(这里的指针指的是磁盘块的偏移量),也就是说内部结点仅仅包含着索引信息。
查询不同;B树在找到具体的数值以后,则结束,而B+树则需要通过索引找到叶子结点中的数据才结束,也就是说B+树的搜索过程中走了一条从根结点到叶子结点的路径。
B+树优点:由于B+树的数据都存储在叶子结点中,分支结点均为索引,方便扫库,只需要扫一遍叶子结点即可,但是B树因为其分支结点同样存储着数据,我们要找到具体的数据,需要进行一次中序遍历按序来扫,所以B+树更加适合在区间查询的情况,所以通常B+树用于数据库索引,而B树则常用于文件索引。
(20) 数据的锁的种类,加锁的方式
以MYSQL为例,
按照类型来分有乐观锁和悲观锁
根据粒度来分有行级锁,页级锁,表级锁(粒度一个比一个大) (仅BDB,Berkeley Database支持页级锁)
根据作用来分有共享锁(读锁)和排他锁(写锁)。

操作系统

(1) 进程与线程的区别和联系(重点)
区别
进程是对运行时程序的封装,是系统进行资源分配和调度的基本单元,而线程是进程的子任务,是CPU分配和调度的基本单元。
一个进程可以有多个线程,但是一个线程只能属于一个进程。
进程的创建需要系统分配内存和CPU,文件句柄等资源,销毁时也要进行相应的回收,所以进程的管理开销很大;但是线程的管理开销则很小。
进程之间不会相互影响;而一个线程崩溃会导致进程崩溃,从而影响同个进程里面的其他线程。
联系 进程与线程之间的关系:线程是存在进程的内部,一个进程中可以有多个线程,一个线程只能存在一个进程中。
(5) 进程调度方法详细介绍
先来先服务 (FCFS first come first serve):短作业优先 (SHF short job first):高响应比优先调度算法:时间片轮转:多级反馈队列(Multilevel Feedback Queue)
(8) 死锁产生的必要条件(怎么检测死锁,解决死锁问题)
(1) 互斥:一个资源每次只能被一个进程使用。
(2) 占有并请求:一个进程因请求资源而阻塞时,对已获得的资源保持不放。
(3) 不可剥夺:进程已获得的资源,在末使用完之前,不能强行剥夺。
(4) 循环等待:若干进程之间形成一种头尾相接的循环等待资源关系。
产生死锁的原因主要是:
(1) 因为系统资源不足。
(2) 进程运行推进的顺序不合适。
(3) 资源分配不当等。
(9) 死锁的恢复
重新启动:是最简单、最常用的死锁消除方法,但代价很大,因为在此之前所有进程已经完成的计算工作都将付之东流,不仅包括死锁的全部进程,也包括未参与死锁的全部进程。
终止进程(process termination):终止参与死锁的进程并回收它们所占资源。
(1) 一次性全部终止;(2) 逐步终止(优先级,代价函数)
剥夺资源(resource preemption):剥夺死锁进程所占有的全部或者部分资源。
(1) 逐步剥夺:一次剥夺死锁进程所占有的一个或一组资源,如果死锁尚未解除再继续剥夺,直至死锁解除为止。
(2) 一次剥夺:一次性地剥夺死锁进程所占有的全部资源。
进程回退(rollback):让参与死锁的进程回退到以前没有发生死锁的某个点处,并由此点开始继续执行,希望进程交叉执行时不再发生死锁。但是系统开销很大:
(1) 要实现“回退”,必须“记住”以前某一点处的现场,而现场随着进程推进而动态变化,需要花费大量时间和空间。
(2) 一个回退的进程应当“挽回”它在回退点之间所造成的影响,如修改某一文件,给其它进程发送消息等,这些在实现时是难以做到的
(10)什么是饥饿
饥饿是由于资源分配策略不公引起的,当进程或线程无法访问它所需要的资源而不能继续执行时,就会发生饥饿现象。
(12)线程之间的通信方式有哪些? 进程之间的同步方式又哪些?
线程之间通信:
使用全局变量;使用信号机制;使用事件
进程之间同步:
信号量;管程
(18) 多线程是如何同步的(尤其是如果项目中用到了多线程,很大可能会结合讨论)
临界区;信号量;事件;互斥量
(19) 同一个进程内的线程会共享什么资源?
该进程的地址空间;全局变量;堆空间

数据库

内外连接的区别?
内连接是保证两个表中所有的行都要满足连接条件,而外连接则不然。

在外连接中,某些不满条件的列也会显示出来,也就是说,只限制其中一个表的行,而不限制另一个表的行。分左连接、右连接、全连接三种。

SQL语言包括哪些类型?
数据定义:Create Table,Alter Table,Drop/Truncate Table, Create/Drop Index

数据操纵:Select ,Insert,Update,Delete

数据控制:Grant,Revoke

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值