【面试复习】

废话简介:之前还在读书的时候写的笔记,一直没有发表,有小伙伴私信我在哪里,问我在学校咋学习的,我想说我就是个菜鸡不用关注我,在学校的时候就瞎写的博客,哪里不正确的我会纠正喔

P2P下载器项目

项目简介
的区别
(1)函数默认值不同:在C++语言中,我们定义或者声明一个函数的时候,会在形参中给它赋一个初始值,作为不传参数的一个缺省值 int fun(int a=10),但是在C 语言是不允许的
(2) 函数的重载:C++中有函数重载这一概念,而C语言中是没有的。重载不关心函数的返回值。重载包括静态多态:函数重载,函数模版;运行时多态:继承中的多态(虚函数)。同一作用域下才会构成重载。
(3)const,C语言中被const修饰的变量叫做常变量或者只读变量,这个变量是无法当做数组的下标使用的,而C++中是可以当做数组的下表使用的。C++中的const定义的时候必须初始化。
(4)引用:引用的底层就是指针,使用时会直接解引用,可以配合const对一个立即数进行引用,int &a=10,(编译错误)const int &a=10;编译成功,被const修饰的都会产生一个临时变量来保存这个歌数据,就有地址可取了。
(5)mallo和new:new和delete是c++的运算符,malloc是在堆上开辟的并且需要确定空间大小再分配,new是在自由存储区,不需要开辟大小。而malloc是一种c的标准库函数。new的底层使用malloc实现的,new失败的话会抛出异常,而malloc会返回0
(6)作用域:C语言作用域有两个:局部和全局。C++有三个:局部作用域,类作用域,名字空间作用域

2、程序编译链接的过程

预处理:展开所有的宏,处理条件编译指令,删除所有注释,添加行号和文件名标识,最后生成一个.i文件
编译:将源代码由文本转化成机器语言,把与处理完的文件进行一个语法词法的分析,生成相应的汇编代码
汇编:将汇编代码转换成机器可以执行的指令
链接:将各个模块相互引用的部分正确的衔接起来,衔接过程主要包括空间和地址分配,符号决议和重定向

3、重载、重写、重定义的区别

重载是指不同的函数使用相同的函数名,但是函数的参数个数或者类型不同,调用的时候根据函数的参数选择不同的函数。在同一作用域

重写是指在派生类中重新对基类的虚函数重新实现,即就是函数名和参数都一样,返回值可以不相同,但是函数的实体不一样,通过重写可以实现多态,就是当父类的指针或者引用指向被重写的虚函数时,父类的指针或者引用指向谁就调用谁的虚函数。并不是说根据类型

重定义也叫隐藏,是指在继承关系中,子类实现了一个和父类名字一样的函数,这样的话子类的函数就把父类的同名函数隐藏了。

4、你对MySQL的索引是如何理解的

SQL(structed query language)结构化查询语言
索引是一种特殊的文件,他们包含着对数据表里所有记录的引用指针。以协助快速查询,更新数据库表中的数据,更通俗的说数据库的索引就相当于目录。为了方便查找书中的内容,通过对内容建立索引形成目录,索引是一个文件,他也是需要占据物理空间的。

索引的优点:
(1)可以加快数据的检索速度,这也是创建索引的主要原因
(2)通过使用索引,可以在查询过程中,使用优化隐藏器,提高系统的性能。

索引的缺点:
(1)时间方面:创建索引和维护索引需要消耗时间,具体的,当对表的数据进行增加,删除和修改时,索引也要动态的维护,会降低增删改的执行效率。
(2)空间:索引需要占据物理空间

索引的使用情景:
(1)where

(2)order by
当我们使用order by 将查询结果按照某个字段排序时,如果没有建立索引,那执行计划会将查询的数据按照外部排序的方式,将数据从硬盘分批读取到内存在使用内部排序,最后合并排序结果。这个是很影响性能的。如果采用索引,索引本身就是有序的,因此直接按照索引顺序和映射关系逐条读取数据即可。
(3)join
对 join 语句匹配关系 on 设计的字段建立索引能够提高效率

索引的数据类型
主键索引:存在且非空,无重复,一个表只有一个主键
唯一索引:无重复,可为空,允许多个列创建唯一索引
alter table table_name add UNIQUE (clomn)
普通索引:基本的索引类型,没有唯一性限制,允许NULL。
alter table table_name add index index_name(column)
全文索引:是目前索引引擎使用的关键技术
alter table tabe_name add fulltext (column)

5、什么是事务

事务是一个不可分割的数据库操作,是数据库并发控制的基本单位。其执行结果必须保证数据库从一种一致性状态变为另一种一致性状态。要么都执行要么都不执行

事务的四大特性介绍一下(ACID)
原子性:事务是最小的执行单位,不允许分割。事务原子性确保动作要么全部完成,要么全部齐作用
一致性:多个事务对数据的读取是相同的
隔离性:并发访问数据库的时候,一个用户的事务不受其他事务的干扰,并发事务之间的操作是相互独立的
持久性:一个事务被提交之后,他对数据库中数据的改变是持久的。

6、数据库的锁

共享锁:当用户进行读的时候要加的锁,可以加多个
排它锁:又叫做写锁,当用户进行写入的时候加入的锁,只能加一个。

数据库的乐观锁和悲观锁是什么?如何实现的
悲观锁:假定会发生并发冲突,屏蔽一切可能违反数据完整性的操作。查询完数据就锁起来,直到提交事务。实现方式:使用数据库的锁机制
乐观锁:假定不会发生并发冲突,只在提交操作的时候检查是否违反数据完整性,修改数据的时候就把事务锁起来,通过vision方式进行锁定 实现方式:乐观锁一般会使用版本号机制或者CAS算法实现

两种锁的使用场景:以上两种锁各有优缺点,不能说设好谁坏,乐观锁一般用于多读场景,即冲突真的很少发生的时候,可以省去锁的开销。悲观锁多适用于写的场景

7、什么是存储过程?

8、什么是数据库的内外连接?

内连接分为三种:等值连接,不等值连接,自连接

外连接(left join/right join):

左外链接:left outer join,以左表为主,先查询出左表,按照on后的关联条件匹配右表,没有匹配到就用NULL填充,可以简写为left join

右外连接:right outer join以右表主,先查询出右表,按照on后的关联条件匹配左表,没有匹配到就用NULL填充,可以简写为right join

9、内存分配的方式

1、从静态存储区分配:此时的内存在程序编译的时候已经分配好,并且在程序的真个运行期间都存在,全局变量,static变量等在此存储
2、在栈区分配:执行时创建,执行结束就会被自动释放。局部变量在此存储
3、在堆去分配:动态分配内存。用new/malloc开辟,生存周期由用户指定。但是存在内存泄漏

10、面向过程和面向对象的理解

在这里插入图片描述

11、什么是自动化测试?自动化测试的场景

12、unordered_map和map的区别

map内部实现了一个红黑树,该结构具有自动排序的功能,因此map内部的所有元素都是有序的,红黑树的每一个节点都代表着map的每一个元素,因此,对于map进行的查找,删除,增加等一系列的操作都相当与是对红黑树进行这样的操作,顾红黑树的效率都取决于map的效率
unordered_map:内部实现了一个哈希表,因此其元素的排列顺序是杂乱的

13、多态的实现原理

C++的多态性那个用一句话来概括就是:在基类的函数前加上virtual关键字,在派生类中重写该函数,运行时将会根据对象的实际类型性来调用响应的函数,存在虚函数的类都含有一个虚表,续表里面存放的是虚函数的地址

纯虚函数:virtual void fun()=0;即抽象类!必须在子类中实现这个函数,即就是现有名称没内容,在派生类中实现内容

为什么要把基类的析构函数定义为虚函数?
在用基类操作派生类的时候,为了防止执行基类的析构函数,不执行派生类的析构函数。因为这样的删除只能删除基类对象,而不能删除子类的对象,造成内存泄漏。定义成虚函数之后,就会形成多态,那么调用时就会直接调用子类的析构,在析构子类的时候会先去析构父类,这样就可以把子类和父类同时析构。

14、排序算法的时间复杂度和空间复杂度

在这里插入图片描述

15、哈希的使用场景?如何解决哈希冲突?

哈希表的主要思想是通过一个哈希函数,把关键码映射的位置取寻找存放至的地方,读取的时候也是直接通过关键码来找到位置并存进去
哈希函数:直接定制法,除留取余法2

哈希冲突无法避免,解决方法是开放地址法(闭散列)链地址法(开散列)
开放地址法做法事,当冲突发生时候,使用探测方法在散列表中寻找下一个空的散列地址(也有两种方法:线性探测和二次探测)缺点:空间利用率比较低

链地址法:首先对关键码集合用散列函数计算散列地址,具有相同地址的关键码归于同一子集和,每一个自己成为一个同,每个桶中的元素用链表连接。可以看出开散列每个桶中存放的都是发生哈希冲突的元素
在这里插入图片描述

16、谈谈你对封装继承多态的理解

在这里插入图片描述

17、软件测试的流程

(1)需求阶段:需求分析-需求评审-业务需求评级
(2)测试计划阶段:测试经理编写测试计划
(3)测试设计阶段:各成员编写测试用例
(4)测试执行阶段:搭建环境,执行冒烟测试
(5)测试评估阶段:出测试报告,对这个跟测试过程和版本质量做一个详细评估,确认是否可以上线
(6)验收阶段:对测试结果进行验收,宣布测试阶段性的结束
(7)文档归档
(8)上线,关注线上功能和线上bug跟踪

18、动态库和静态库的区别

动态库一般以.so为文件后缀,在编译的时候无需依赖库的存在,但是在运行的时候需要加载库;也就是说可执行文件无法单独运行。

静态库一般以.a为文件后缀,在编译的时候会直接整合到目标程序中,所以利用静态函数编译成的文件会比较大,该类函数最大的优点就是编译成功的可执行文件可以独立运行,不需要向外部要求读取函数库的内容;但是当函数库更新,需要重新编译。

19、谈谈你对软件测试的理解

软件测试就是利用测试工具按照测试方案和流程对产品进行功能和性能测试,甚至根据需要编写不同的测试工具,设计和维护测试系统,对测试方案可能出现的问题进行分析和评估的过程。

从不同的角度软件测试可以分为手工测试和自动化测试。手工测试:不使用任何测试工具,根据事先设计好的测试用例来运行系统,测试各个功能模块。自动化测试:利用测试工具,通过编写测试用例脚本和输入测试数据,自动运行测试程序。
从另外一个角度,软件测试

20、黑白盒测试的概念

黑盒测试一般用来确认软件功能的正确性和可操作性,目的是检测软件的各个功能能否得以实现。把被测试的程序当做一个黑盒子,不考虑内部结构,再知道程序的输入与输出之间的关系或程序功能的情况下,依靠软件规格说明书来进行的一个测试。

白盒测试:根据软件内部的逻辑结构分析来进行测试,测试人员通过阅读程序代码或者使用开发工具中的单步调试 来判断软件的质量。

21、谈谈你对进程和线程的理解

一个程序就是一个进程,而一个程序中的多个任务被称为线程。进程是资源分配的基本单位,又是调度运行的基本单位。线程是资源调度的基本单位。简而言之,进程和线程都是一个时间段的描述,知识颗粒大小不同而已。线程包含在进程之中,是进程中实际运作的基本单位

区别:
(1)进程是资源分配的基本单位,线程是资源调度的基本单位
(2)进程有自己独立的地址空间,每启动一个进程,系统都会为其分配地址空间,线程没有独立的地址空间,它和进程共享程序地址空间。
(3)CPU切换一个线程比切换一个进程的花费小。创建一个线程比创建一个进程开销小。
(4)线程占用资源比近程少,线程只是拥有运行时所需要的一点点资源

22、java和C++的区别

总共可以从五个方面介绍:
语言层面
(1)java是纯面向对象语言,所有变量和方法都在类中声明和定义,而C++中还含有面向过程的东西,比如全局变量和全局函数
(2)C++是编译型强类型语言,有编译器直接编译成本地机器识别的机器语言。java是半变异性半解释性语言,由编译器得到的class字节码文件,然后由虚拟机解释执行,由JIT即时编译器进行热点代码探测直接翻译成机器码。
(3)java没有指针,虽然虚拟机底层实现还是依赖指针,但是不对外开放,更加安全。C++存在各种指针*、常量指针、指向指针的指针,还有与指针对应的取地址&,C++指针使用不当可能存在野指针,指向一个已经删除的对象或者有访问权限限制的内存区域。
类与继承
(1)C++可以实现多继承抽象基类
(2)java只能实现单继承,但可以进行接口多实现和接口多继承接口
(3)C++抽象类用virtual,Java中用的是abstract,接口用interface
(4)C++有类还有结构体,联合体,其中类成员变量默认访问权限是private,java只有类,类的成员变量默认访问权限为default,是一种包可见访问权限
操作层面
(1)C++可以进行函数重载,还可以进行运算符重载
(2)java只允许函数重载,不允许运算符重载
(3)java 引入真正的数组,将指针从中去掉,C++采用的是“伪数组”,需要时刻关注数组越界问题。
内存管理
(1)java有自动的内存管理,C++需要手动的去申请和释放
(2)C++程序内存分区为代码段,数据段,堆,栈其中代码段用来存储程序代码,数据段用来存储全局变量和静态数据,堆用于内存分配,栈用来存储局部变量函数参数
(3)java内部内存分为程序计数器、堆、栈、方法区,其中栈又分为本地方法栈和虚拟的栈,分别用来存储本地方法和java方法的局部变量。程序计数器用来存储当前线程执行的字节码行号。堆用来存储对象实例,方法区用来存储常量,静态变量,编译后的机器代码等信息。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值