招银面经

目录

测试

1.测试的一些方法,因果图

2.测试的流程

3.测试主要测试哪些方面?

4.编写测试用例包括哪几个条目

5.兼容性测试是什么?

6.测试微信登陆功能

7.怎样测试用户体验?

8.测试一个刷脸支付的平板,你认为应该测试哪些方面?

9.APP兼容性怎么测试?

10.测试商家扫客户二维码(提示二维码在app上)

11.测试实例(登录APP,用手机号得到验证码的方式登录)

12.ATM用户插卡和取钱功能的测试

13. 写代码,输入年月日,输出是一年中第几天,然后用黑盒和白盒测试分别测试这个程序

14.App买电影票

15.POS机  如何测试

16.测试支付宝的转账中的“转账到银行卡”的功能

C++

0.数组和指针的区别

1.指针和引用的区别

2.内存分区

3.静态(成员)函数的作用

4.静态变量,什么时候会用到

5.构造函数和析构函数

6.map,set的区别,用什么实现的,然后追问二叉树,平衡二叉树。。。

7. C++的三个基本特征以及每个的具体解释

8.循环和递归的区别,优缺点

9.说一下宏

10.重写和重载的区别

11.深拷贝和浅拷贝

12.如何实例化类里面的对象

13.虚函数

14.时间复杂度,如果一个算法的时间复杂度是O(1)代表的含义是什么

15.头文件重复的包含和重复的引用

16.抽象类与接口的区别?

17指针数组和数组指针的区别

18.class和struct的区别

19.int和float的字节数,如果在不同的机型上有没有区别

20.类里有一个int有一个virtual,占多少字节。各在什么位置。

21.list和vector区别

22.内存溢出和内存泄漏

23.空指针和野指针的区别

24.new和malloc区别

25.Static

26.DFS、BFS

数据库

1.数据库给一个表把年龄23-30之间的人的总数查出来

2.group by 和having

3.事务是什么?事务的特性、主要作用;一致性是啥,隔离级别,分别解决了什么问题?默认是什么级别?序列化是啥,可重复度读是啥。。。

4.索引是什么、结构、原理以及优缺点;为什么使用B+树;什么情况下不建议使用索引;在一列添加索引,什么情况下索引什么并没有生效,如何改进;

5.死锁是什么?如何避免?乐观锁悲观锁

6.drop、delete以及truncate的区别

7.数据库的范式

8.数据库的优化的思路

9.事务一般在哪个层进行控制?为什么?

10. Mysql Oracle是什么类型的数据库 还有什么其他类型的数据库? Mysql的优势是什么?

11.删除表和删除字段分别用什么关键词

12.怎么把所有重复的字段查询出来

13.怎么修改一个表的某个字段长度

14.数据库左连接、右连接是什么,区别?内连接和外连接区别

15.给一个成绩表,查找一个班级里平均分大于90的学生姓名

16.select * 为什么不好呢?

17.数据库建表存储引擎怎么选(innodb,myisam的区别)?同一条SQL语句在InnoDB和MyISAM下哪个执行快?

18.建立索引和主键怎么考虑

19.数据库的完整性和一致性可以使用什么方法保证

20.收回用户权限的命令

21.五张关联表 如何快速查询 什么方法可以提升查询效率

22.给你一个5亿行的数据,如何设计表?

23.查找学生信息表里姓名第一个字为‘王’的学生姓名

24.统计个数

25.视图的优缺点

26.select语句的执行逻辑

27.存储过程

28.输入中文 数据库查询出来是乱码如何解决 例如GBK如何转UTF-8

计算机网络

1.TCP哪一层,FTP呢,http包含哪些部分

2.get和post的区别

3.IOS七层模型讲一下

4.TCP的滑动窗口、拥塞控制

5. HTTP协议包括哪些请求

6.TCP和UDP的区别?

7.输入一个URL后发生了什么?

8.常用协议端口 80用于什么协议

9.三次握手过程?

10.Tcp协议是什么?TCP头部和数据部分是不是等长的?

11.发邮件用什么协议,tcp特性

Linux

1.常用的一些linux的命令,ll和ls的区别

数据结构

1.堆和栈的区别?

 2.二叉树的使用场景

3. 快速排序、堆排序原理、冒泡排序,最好和最坏的情况下时间复杂度是多少

4. 数组和链表的区别

5. 双向链表优点

6.链表、二叉树、哈希的查找复杂度

操作系统

1.为什么引用多进程

2. 进程和线程分别是什么?进程和线程的区别?进程间通信的有哪几种方式

3.进程互斥和进程同步

场景题

2.怎么看待测试开发,测试和开发结合起来的意义?

代码

1.递归写n!

2.leetcode283----移动 0 (简单题)

3.统计字符串字符再按字典顺序输出,然后一直问还有没有改进空间

4.给一个偶数,求和为该偶数且差值最小的质数对

5.翻转链表(剑指offer24)

6.两个队列实现栈,两个栈实现队列

7.给一个txt文件,输出文件中每个单词的出现次数

智力题

1.一元钱买一瓶水,2个盖子换一瓶水。20块能买几瓶水?


测试

1.测试的一些方法,因果图

按测试对象

(1)白盒测试

(2)黑盒测试

(3)灰盒测试

按测试对象是否执行

(1)静态测试

(2)动态测试

按测试手段

(1)手工测试

(2)自动化测试

招银面经

 

2.测试的流程

需求分析

(1)梳理清楚需要设计的点是什么

(2)需求来源:需求规格说明书、API文档、竞品分析、个人经验

设计用例

评审用例

配置环境

执行用例

(1)执行用例前会做一个冒烟测试:核心是快速的对当前软件的核心功能进行验证。若有问题,将此版本回退给开发

回归测试及缺陷跟踪

(1)回归测试:指的是当我们将某个缺陷提交给开发,修复完成之后,需要测试人员再次对其进行测试

(2)缺陷跟踪:当测试人员发现某个缺陷之后需要一直对其进行状态的跟踪

输出测试报告

测试过程中产生的数据进行可视化输出

测试结束

产生的文档进行整理归档

 

3.测试主要测试哪些方面?

【功能靠用,效率可以】

功能性、可靠性、易用性、效率性、可维护性、可移植性

 

4.编写测试用例包括哪几个条目

(1)标题或者描述

(2)前置条件,要执行这个测试所需要满足的条件

(3)用例编号

(4)执行步骤

(5)预期结果

(6)实际结果,这个是每次测试用例执行完后需要填写的

(7)用例执行日期

(8)用例执行者(如果是一个人测试的话,这个字段就是所有用例所共有的)

(9)测试环境:包括软硬件环境,配置信息等,但因为我每次测试都在同样环境中执行不止一个用例,所以测试环境是每次执行的测试用例所共有的信息.

 

5.兼容性测试是什么?

软件兼容性测试是指检查软件之间能否正确地进行交互和共享信息。

 

6.测试微信登陆功能

一、界面

1、登录界面是否清晰合理美观,无乱码(文字简洁、无错别字)

二、功能(主要采用等价类、边界值方法)

1、输入正确的用户名、密码,是否登录成功

2、输入错误的用户名或者密码,登录失败有没有提示(用户名或密码为空)

3、不同的登陆方式:手机号、微信号、扫码

4、记住用户名的功能

5、点击登陆页面中的注册、找回密码等是否能跳到正确的页面

6、大写键盘开启,是否提示

三、安全性

1、在登录页面,输入的密码是否隐藏显示

2、多次登录失败,系统会不会阻止后续的尝试以应对暴力**

3、用户名、密码能否支持复制、粘贴

4、密码输入框内的密码是否都可以在页面源码模式下被查看

四、兼容性

1、不同平台下能否正常打开登录界面,界面正常

2、相同平台下的不同版本能否正常打开登录界面,界面正常

3、不同分辨率下显示是否正常

4、不同网络下显示是否正常

五、性能压力

1、打开登陆页面,需要多长时间

2、输入正确用户名、密码之后点击登录按钮,直到登录成功打开页面,需要多长时间(小于3秒)

3、多个用户同时进行登录操作,相应登录的时间是否会变长(小于5秒)

 

7.怎样测试用户体验?

(1)感官体验:呈现给用户视听上的体验,强调舒适性。

(2)交互体验:呈现给用户操作上的体验,强调易用/可用性。

(3)情感体验:呈现给用户心理上的体验,强调友好性。

(4)浏览体验:呈现给用户浏览上的体验,强调吸引性。

(5)信任体验:呈现给用户的信任体验,强调可靠性。

 

8.测试一个刷脸支付的平板,你认为应该测试哪些方面?

【功能靠用,效率可以】

功能性、可靠性、易用性、效率性、可维护性、可移植性

 

9.APP兼容性怎么测试?

(1)系统

a.安卓 不同版本

b. ios 不同版本

(2)分辨率

(3)网络

       a. wifi

        b. 4G

(4)其他

数据兼容性(不同版本间的数据兼容)
蓝牙设备兼容性测试 (如果是一款使用蓝牙的应用)
存储卡兼容性测试(比如文件管理器)
第三方软件兼容冲突(比如输入法冲突)

 

10.测试商家扫客户二维码(提示二维码在app)

用户角度:

功能性测试:

(1)用户能否成功生成用于支付的二维码

(2)二维码出现后屏幕能否变成增亮的模式,

(3)用户能否成功选取不同的付款方式,比如“花呗”、“账户余额”、“余额宝”、“银行账户”等。

(4)扫码完成后,用户能否收到支付成功的界面,并且界面能正确显示用户支付的金额,包括付款信息、是否使用优惠、折扣等。

界面测试:打开支付宝后,能否正确显示界面,二维码的界面是否正确,支付的每个步骤界面是否正确。

易用性测试:在整个用户支付的过程中,操作步骤是否简易方便。

兼容性:测试扫码支付功能,在不同手机品牌,不同操作系统下是否兼容。

安全测试:二维码如果超过安全时间后能否自动更新为新的二维码。测试整个支付流程的安全机制能否成功实现。

压力测试:持续的扫码,测试扫码支付功能在强压的状态下,工作状态如何。

网络测试:测试在不同网络环境下,不同网络信号强度的情况下,整个支付流程是否出现卡顿,卡顿的点容易出现在哪里。

 

商家角度:

功能性测试

(1)扫码后能否成功扫到用户手机中的二维码,

(2)扫码成功后能否收到钱,并且成功生成收款的界面。

(3)支付宝后台、商家后台、用户手机能否成功传输支付结果信息。

易用性测试:在不同光线,屏幕不同亮度的情况下,能否成功完成扫码收款的功能。

其他测试与用户测试差不多。

 

11.测试实例(登录APP,用手机号得到验证码的方式登录)

通过性测试

输入正确的手机号码,点击获取验证码,查看手机是否收到短信。收到短信后输入验证码,若为登录功能,还应检查是否进行页面跳转,是否正确进行登录,是否可操作登录后应操作的项,若功能为注册,则应查看是否注册成功,去数据库检查数据的正确性,若测试成功后进行非通过性测试

正确的手机号验证的规则为:13,14,15,17,18为开头的11位数字

为空测试

(1)不输入手机号,不输入验证码 直接点击登录或注册等功能点 ,提示不能为空

(2)不输入手机号,只输入验证码 直接点击登录或注册等功能点 ,提示不能为空 

(3)输入手机号码,不输入验证码 直接点击登录或注册等功能点  ,提示不能为空

输错手机号码错误测试

(1)输入汉字、小数,字符串,空格及组合在手机号码文本框中,提示手机号码不正确

(2)输入10位,12位数字进行登录,提示手机号码不正确,提示手机号码不正确

(3)输入11位非手机号码进行获取验证码,提示手机号码不正确

验证码

(1)输入错误的验证码,提示请输入正确的验证码

(2)输入多一位或少一位的验证码

(3)明确验证码的失效时长后,在时长之后输入验证码,提示该验证码已失效,请重新获取验证码

 

12.ATM用户插卡和取钱功能的测试

(1)成功取钱

(2)卡无效

(3)密码错误

(4)余额不足

(5)ATM机余额不足

(6)超过提款限额

 

13. 写代码,输入年月日,输出是一年中第几天,然后用黑盒和白盒测试分别测试这个程序

招银面经

黑盒测试

年份                                                           预期结果

能被4整除,不能被100整除的年份        

能被4和100整除,不能被400整除

能被4、100、400整除的年份

偶数,不能被4整除

奇数年份

小于0的年份,月,天

不同的月份 1 2 12临界点

不同的日   1 28 29 30 31

白盒测试

(1)语句覆盖

(2)分支覆盖  闰年||平年

 

14.App买电影票

15.POS机  如何测试

16.测试支付宝的转账中的“转账到银行卡”的功能

 

C++

0.数组和指针的区别

(1)数组是用于存储多个相同数据类型的集合;指针相当于一个变量,存放的是其他变量在内存中的地址

(2)同类型指针变量可以相互赋值;数组不行

(3)数组在内存中连续存放;指针很灵活,可以指向任意类型的数据

(4)sizeof(数组名)=数组的大小;sizeof(指针),32位系统下=4

(5)数组传参时,会退化为指针

 

1.指针和引用的区别

(1)指针存储变量的地址,引用跟原来的变量实质上是同一个东西,只不过是原变量的一个别名

(2)指针可以为空;引用不可以为空,使用之前必须初始化

(3)指针的值在初始化后可以改变;引用不可以

(4)sizeof指针得到的是指针本身的大小;sizeof引用得到的是变量的大小

(5)指针可以多级;引用只有一级

 

2.内存分区

(1)代码区:二进制代码

(2)全局区:全局变量,静态变量,常量

(3)堆区:编译器自动分配和释放,存放函数的参数、局部变量。New分配的

(4)栈区:程序员分配和释放

(5)自由存储区:由malloc等分配的内存块,他和堆是十分相似的,不过它是用free来结束自己的生命的。

 

3.静态(成员)函数的作用

  (1) 不需要生成一个对象的实例就可以直接使用该函数

(2)提供一种方式访问静态成员变量

(3)避免使用全局函数,为函数设置一个类域的访问权限

 

4.静态变量,什么时候会用到

(1)变量所包含的对象体积较大,占用内存较多。

(2)变量所包含的对象生命周期较长。

(3)变量所包含的对象数据稳定。

(4)该类的对象实例有对该变量所包含的对象的共享需求。

 

5.构造函数和析构函数

构造函数用来初始化类对象的成员的,所以当创建类对象就会调用构造函数。特点:

(1)函数名和类名必须一样,没有返回值。

(2)当没有显式的定义构造函数时,系统会自己生成默认的构造函数。

(3)可以重载,不可以为虚函数。

析构函数用来释放对象使用的资源,并销毁非static成员。特点:

(1)函数名是在类名前加上~,无参数且无返回值。

(2)一个类只能有且有一个析构函数,如果没有显式的定义,系统会生成一个缺省的析构函数。

(3)析构函数不能重载。

 

6.map,set的区别,用什么实现的,然后追问二叉树,平衡二叉树。。。

map和set区别:

(1)map中的元素是key-value(关键字--值)对:关键字起到索引的作用,值则表示与索引相关联的数据;Set就是关键字的简单集合。

(2)set的迭代器是const的,不允许修改元素的值;map允许修改value,但不允许修改key。

(3)map支持下标操作,可以用key做下标,不建议使用;set不支持下标操作。

 

底层实现都是红黑树。

 

二叉树:每个节点最多含有两个子树的树结构。

平衡二叉树:任何节点的两个子树的高度最大差为1

红黑树:节点是红色或黑色;根节点、叶子节点是黑色;每个红色节点的两个子节点都是黑色

 

7. C++的三个基本特征以及每个的具体解释

封装:将对象的属性和行为封装起来,也就是将数据和基于数据的操作封装在一起,保护数据并隐蔽具体的细节,只保留有限的接口与外界联系

继承:是指可以让某个类型的对象获得另一个类型的对象的属性的方法。

       多态:在基类的函数前加上virtual关键字,在派生类中重写该函数,运行时将会根据对象的实际类型来调用相应的函数。

底层原理

第一:编译器在发现基类中有虚函数时,会自动为每个含有虚函数的类生成一份虚函数表,该表是一个一维数组,虚表里保存了虚函数的入口地址。

第二:编译器会在每个对象的前四个字节中保存一个虚表指针vptr,指向对象所属类的虚函数表。在程序运行时,根据对象的类型去初始化vptr,从而让vptr指向正确的虚函数表。

 

8.循环和递归的区别,优缺点

循环:通过设置初始值和终止条件,在一个范围内重复运算

递归:函数内部调用这个函数本身。

(2)优缺点

递归

优点:可读性好;

缺点:浪费空间,而且递归太深容易造成堆栈的溢出。

循环

优点:代码运行效率好,没有额外的空间开销;

缺点:代码不如递归简洁

 

9.说一下宏

C/C++中的宏定义是进行符号常量定义,宏定义会在预处理阶段将用define定义的内容对代码中相应的标识符进行替换。

使源代码更具有可读性,能在一定程度上提高程序的运行效率。

 

10.重写和重载的区别

重载:具有不同参数(参数的类型,个数,顺序不同)的同名函数,根据参数确定调用哪个函数,重载不关心函数返回类型。

重写:是指派生类中存在重新定义的函数。其函数名,参数列表,返回值类型,所有都必须同基类中被重写的函数一致,只有函数体不同。重写的基类中被重写的函数必须有virtual修饰。

 

11.深拷贝和浅拷贝

浅拷贝和深拷贝主要区别就是复制指针时是否重新创建内存空间。如果没有创建内存只赋值地址为浅拷贝,创建新内存并把值全部拷贝一份就是深拷贝。

 

12.如何实例化类里面的对象

(1)隐式创建

       CEmployee cEmployee1; //隐式创建并调用无参构造器

CEmployee cEmployee2(2); //隐式创建并调用有参构造器

(2)显式创建

       CEmployee cEmployee1 = CEmployee; //显式创建并调用无参构造器

CEmployee cEmployee2 = CEmployee(2); //显式创建并调用无参构造器

(3)显式new创建

CEmployee *cEmployee1 = new CEmployee; //显式new创建并调用无参构造器

CEmployee *cEmployee2 = new CEmployee(2); //显式new创建并调用无参构造器

 

13.虚函数

作用:主要是实现了多态的机制。通过父类的指针调用实现子类的成员函数。这种技术可以让父类的指针有“多种形态”。

关键字:Virtual

 

14.时间复杂度,如果一个算法的时间复杂度是O(1)代表的含义是什么

时间复杂度是指执行算法所需要的计算工作量

 O(1) 表示耗时/耗空间与输入数据大小无关,无论输入数据增大多少倍,耗时/耗空间都不变。

 

15.头文件重复的包含和重复的引用

在编译c或c++程序时候,编译器首先要对程序进行预处理,会把#include的头文件完整的展开,如果多次包含相同的头文件,会导致编译器在后面的编译步骤多次编译该头文件,可能使程序崩溃。

解决:条件编译 和 #pragma once

 

16.抽象类与接口的区别?

(1)抽象类要被子类继承,接口要被类实现。

(2)接口只能做方法声明,抽象类中可以作方法声明,也可以做方法实现。

(3)接口里定义的变量只能是公共的静态的常量,抽象类中的变量是普通变量。

(4)接口是设计的结果,抽象类是重构的结果

(5)抽象类和接口都是用来抽象具体对象的,但是接口的抽象级别最高。

(6)抽象类可以有具体的方法和属性,接口只能有抽象方法和不可变常量。

(7)抽象类主要用来抽象类别,接口主要用来抽象功能。

 

17指针数组和数组指针的区别

数组指针(也称行指针)

定义 int (*p)[n];指向一维数组的指针,亦称行指针

指针数组

定义 int *p[n];

区别:数组指针只是一个指针变量,C语言里专门用来指向二维数组的,它占有内存中一个指针的存储空间。指针数组是多个指针变量,以数组形式存在内存当中,占有多个指针的存储空间。

 

18.classstruct的区别

(1)默认访问权限

struct是public,class是private

(2)默认继承权限

struct是public,class是private

(3)若没有定义构造函数,struct可以使用{ }进行初始化,而只有当class的所有数据成员及函数为public时,可以使用{ }进行初始化

(4)class这个关键字可用于定义模板参数。strcut不用于定义模板参数

 

class和struct可以相互继承,默认继承方式取决于子类

 

19.intfloat的字节数,如果在不同的机型上有没有区别

4字节

 

20.类里有一个int有一个virtual,占多少字节。各在什么位置。

8字节(4+4)

Vptr前4个

Int后4个

 

21listvector区别

(1)vector底层实现是数组;list是双向链表。

(2)vector支持随机访问,list不支持。

(3)vector是顺序内存,list不是。

(4)vector在中间节点进行插入删除会导致内存拷贝,list不会。

(5)vector一次性分配好内存,不够时才进行2倍扩容;list每次插入新节点都会进行内存申请。

(6)vector随机访问性能好,插入删除性能差;list随机访问性能差,插入删除性能好。

 

22.内存溢出和内存泄漏

内存溢出:系统已经不能再分配出你所需要的空间,比如你需要100M的空间,系统只剩90M了,这就叫内存溢出

内存泄漏: 意思就是你用资源的时候为他开辟了一段空间,当你用完时忘记释放资源了,这时内存还被占用着,一次没关系,但是内存泄漏次数多了就会导致内存溢出

 

23.空指针和野指针的区别

空指针是指一个指针的值为null

野指针会指向一段实际的内存,只是它指向哪里我们并不知情,或者是它所指向的内存空间已经被释放。

 

24.newmalloc区别

(1)属性:new是C++关键字,需要编译器支持;malloc是库函数,需要头文件支持

(2)参数:new不需要指定内存块大小;malloc需要

(3)返回类型:new返回对象类型的指针;malloc返回void*

(4)分配失败:new分配失败抛出异常;malloc返回null

(5)自定义类型:new可以为自定义类型的对象调用构造函数完成初始化,malloc不可以

(6)重载:new允许重载,malloc不可以

 

25.Static

static声明局部变量:

(1)指定变量的存储位置和生存期,静态变量存放在静态存储区,生存期与程序的运行期相同。

(2)定义静态变量未赋初值,系统自动赋值0

(3)一直保留上一次函数结束时的值

(4)在作用域之外不能使用

static声明全部变量:

(1)将全局变量的作用域限制在本文件

 

26.DFSBFS

招银面经

(1)dfs:深度优先搜索

1 2 5

退回2 6

退回1 3 7

退回3 8 9 11

退回8 10 12

退回1 4

(2)bfs:广度优先搜索

       1

       2 3 4

       5 6 7 8

       9 10

       11 12

 

27.指针是什么,和智能指针的区别

28.main能不能被重写或重载

29.如何查看内存泄漏的情况,如何判断内存泄漏

30.类中实例对象和类对象的区别

 

 

数据库

1.数据库给一个表把年龄23-30之间的人的总数查出来

select  count(*) from 表名 where age>=23 and age<=30;

 

2.group by having

group by :按照某个字段或者某些字段进行分组。

having :having是对分组之后的数据进行再次过滤。

 

3.事务是什么?事务的特性、主要作用;一致性是啥,隔离级别,分别解决了什么问题?默认是什么级别?序列化是啥,可重复度读是啥。。。

定义:事务是一个完整的业务逻辑单元,不可再分

特性:原子性、隔离性、一致性、持久性

事务的一致性:事务要求所有的DML语句操作的时候,必须保证同时成功或者同时失败

隔离级别

(1)读未提交

存在脏读现象:当前事务可以读取到对方未提交的数据。

(2)读已提交

解决了: 脏读现象。

存在不可重复读:一个事务范围内的两个相同的查询却返回了不同数据

(3)可重复读

       解决了:不可重复读问题。(update)

存在幻读:同一个事务内多次查询返回的结果集不一样(比如增加了或者减少了行记录insert)。

(4)序列化读/串行化读 

解决了所有问题。效率低。需要事务排队

默认:可重复读

可重复读:事务开启,不允许其他事务的UPDATE修改操作(MVCC多版本并发控制实现)

序列化:这种级别下,事务“串行化顺序执行”,也就是一个一个排队执行。

 

4.索引是什么、结构、原理以及优缺点;为什么使用B+树;什么情况下不建议使用索引;在一列添加索引,什么情况下索引什么并没有生效,如何改进;

定义: 索引就相当于一本书的目录,通过目录可以快速的找到对应的资源。

结构:B + Tree

原理:通过B +Tree缩小扫描范围,底层索引进行了排序,分区,通过索引检索获取到关联的物理地址,通过物理地址定位表中的数据。

优点

(1)可以大大加快数据的检索速度

缺点: 

(1)创建索引和维护索引要耗费时间,这种时间随着数据量的增加而增加。

(2)索引需要占物理空间

(3)当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护

原因:B+树的磁盘读写代价更低;B+树的查询效率更加稳定;只需要去遍历叶子节点就可以实现整棵树的遍历

(1)数据唯一性差的字段

(2)频繁更新的字段不要使用索引

(3)字段不在where语句出现时不要添加索引

(4)数据量少的表不要使用索引

 

(1)条件中有or,即使其中有条件带索引也不会使用

(2)对于多列索引,不是使用的第一部分,则不会使用索引

(3)模糊查询的时候,第一个通配符使用的是%,这个时候索引是失效的。

 

5.死锁是什么?如何避免?乐观锁悲观锁

死锁是指两个或两个以上的进程(或线程)在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。

 

加锁顺序(线程按照一定的顺序加锁)

加锁时限(线程尝试获取锁的时候加上一定的时限,超过时限则放弃对该锁的请求,并释放自己占有的锁)

死锁检测

 

悲观锁:总是假设最坏的情况,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会阻塞直到它拿到锁。

乐观锁:就是很乐观,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据。

 

6.dropdelete以及truncate的区别

drop:删除内容和定义,释放空间。(表结构和数据一同删除)
truncate:删除内容,释放空间,但不删除定义。(表结构还在,数据删除)
delete:删除内容,不删除定义,也不释放空间。
效率一般来说:drop> truncate > delete

 

7.数据库的范式

第一范式:任何一张表都应该有主键,并且每一个字段原子性不可再分。

第二范式:建立在第一范式的基础之上,所有非主键字段完全依赖主键,不能产生部分依赖。

第三范式:建立在第二范式的基础之上,所有非主键字段直接依赖主键,不能产生传递依赖。

 

8.数据库的优化的思路

(1)硬件优化

(2)结构优化

       1)范式优化:消除冗余

       2)反范式优化:适当增加冗余

       3)避免数据维护中出现更新、插入和删除异常

       4)拆分表:垂直拆分和水平拆分

(3)SQL语 句优化

 

9.事务一般在哪个层进行控制?为什么?

Service

一般的时候,我们的service层可以调用多个dao层,我们只需要在service层加一个事务注解@Transactional,这样我们就可以一个事务处理多个请求,事务的特性也会充分的发挥出来。

 

10. Mysql Oracle是什么类型的数据库 还有什么其他类型的数据库? Mysql的优势是什么?

关系型数据库

还有非关系型数据库   nosql

(1)支持AIX、FreeBSD、HP-UX、Linux、Mac OS、NovellNetware、OpenBSD、OS/2 Wrap、Solaris、Windows等多种操作系统。

(2)为多种编程语言提供了API。这些编程语言包括C、C++、Python、Java、Perl、PHP、Eiffel、Ruby和Tcl等。

(3)支持多线程,充分利用CPU资源。

(4)优化的SQL查询算法,有效地提高查询速度。

(5)提供TCP/IP、ODBC和JDBC等多种数据库连接途径。

(6)支持大型的数据库。

(7)支持多种存储引擎。

(8)Mysql是开源的,免费。

 

11.删除表和删除字段分别用什么关键词

删除表:drop table tablename;

删除字段:delete from tablename  where  username = '123';

 

12.怎么把所有重复的字段查询出来

select 字段名 from 表名 group by 字段名 having (count(字段名)>1)

 

13.怎么修改一个表的某个字段长度

alter table 表名 modify 字段名 char(20)

 

14.数据库左连接、右连接是什么,区别?内连接和外连接区别

内连接:A表和B表能够匹配上的记录查询出来,这就是内连接。

外连接:AB两张表中有一张表是主表,一张表是副表,当副表中的数据没有和主表中的数据匹配上,副表自动模拟出NULL与之匹配。

 

左连接:左边有的,右边没有的为null

右连接:右边有的,左边没有的为null

内连接:显示左边右边共有的

 

15.给一个成绩表,查找一个班级里平均分大于90的学生姓名

招银面经

1.select avg(grade), sname from s

join sc

on s.sno = sc.sno

group by sname

2.select sname, sno, avg(grade) from s

join sc

on s.sno = sc.sno

group by sname

having avg(grade)>90

 

16.select * 为什么不好呢?

要通过查询数据字典完成的,这意味着将耗费更多的时间

 

17.数据库建表存储引擎怎么选(innodbmyisam的区别)?同一条SQL语句在InnoDBMyISAM下哪个执行快?

(1)InnoDB支持事务,MyISAM不支持。

(2)InnoDB支持外键,而MyISAM不支持。

(3)InnoDB是聚集索引,数据文件是和索引绑在一起的,必须要有主键,通过主键索引效率很高。而MyISAM是非聚集索引,数据文件是分离的,索引保存的是数据文件的指针。

(4)Innodb不支持全文索引,而MyISAM支持全文索引,查询效率上MyISAM要高。

 

18.建立索引和主键怎么考虑

(1)主键属于索引的一种。

(2)根据数据库的功能,可以在数据库设计器中创建三种索引:唯一索引、主键索引和聚集索引。而主键只是其中的一种。

(3)创建方式不同:

可通过定义 PRIMARY KEY 约束来创建主键。一个表只能有一个 PRIMARY KEY 约束,而且 PRIMARY KEY 约束中的列不能接受空值。由于 PRIMARY KEY 约束确保唯一数据,所以经常用来定义标识列。经常在WHERE子句中的列上面创建索引。

 

19.数据库的完整性和一致性可以使用什么方法保证

(1)尽可能使用约束,如主键、非空字段等

(2)使用触发器

 

20.收回用户权限的命令

Revoke

 

21.五张关联表 如何快速查询 什么方法可以提升查询效率

(1)确保连接的字段有索引

(2)尽可能把限制条件写在前面(取尽可能少的行)

(3)每次只取必须的数据列(取尽可能少的列)

 

22.给你一个5亿行的数据,如何设计表?

分库分区,根据主键的范围或者哈希来分

 

23.查找学生信息表里姓名第一个字为‘王’的学生姓名

模糊查询:%代表任意多个字符,_代表任意1个字符。

select name from 表名 where name like “王%”

 

24.统计个数

sum() 统计总和

count() 统计行数

 

25.视图的优缺点

优点:简化了操作;安全;逻辑上独立性

缺点:性能差;修改有限制

 

26.select语句的执行逻辑

select            6

from              1

join on        2

where             3

group by         4            (按照某个字段或者某些字段进行分组)

having           5            (对分组之后的数据进行再次过滤)

order by         7

 

27.存储过程

存储过程是一组为了完成特定功能的SQL 语句集,经编译后存储在数据库中,用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它。类似于C语言中的函数。

 

28.输入中文 数据库查询出来是乱码如何解决 例如GBK如何转UTF-8

(1)在PHP文件的头部,写上:header('Content-type:text/html;charset=utf-8');

(2)php链接数据库之后执行:

//链接数据库

$lianjie=new mysqli("数据库地址","用户名","密码","数据库名");

$lianjie=new mysqli("localhost","root","root","web");

//设置编码

mysqli_query($lianjie,"set names utf8");

(3)用Navicat for MySql软件新建数据库的时候,选择字符集为utf8

 

29.如何保证不同数据库之间的数据一致性。对于数据库层面的设计模式,有什么方法可以来处理上述的数据一致性情况,不追求即时同步,只要两个数据库在事务操作完成之后最终数据是同步的就可以。

30.多数据库嵌套事务会存在什么问题,怎么解决?

31. 10亿数据查某个手机号出现的次数

 

计算机网络

1.TCP哪一层,FTP呢,http包含哪些部分

传输层

应用层

http包含通用头域、请求消息、响应消息和主体信息。

 

2.getpost的区别

招银面经

 

3.IOS七层模型讲一下

物理层:

为数据的传输提供各种可靠的物理媒介(环境)。

数据链路层:

负责将网络层交下来的 IP 数据报封装成帧,

网络层:

为两台主机提供通信服务,并通过选择合适的路由将数据传递到目标主机。

IP,ARP(地址解析协议),ICMP(网际报文控制协议)

传输层:

为两台主机中的进程提供通信服务。

TCP,UDP

会话层:

建立、维护和释放应用程序之间的连接

表示层:

对数据进行翻译、加密和压缩

应用层:

提供用户接口,如客户端程序QQ等

HTTP协议(万维网服务)、FTP协议(文件传输)、SMTP协议(电子邮件)、DNS(域名查询)

 

4.TCP的滑动窗口、拥塞控制

       1.“窗口”对应的是一段可以被发送的字节序列,其连续的范围称为窗口;2.“滑动”则是指这段“允许发送的范围”是可以随着发送的过程而变化的,方式就是按顺序“滑动”。

是一种流量控制方法,该协议允许发送方在停止等待确认前可以连续发送发个分组。由于发送方不必每发送一个分组就停下来等待确认,因此该协议可以加速数据的传输。

网络中的链路容量和交换结点中的缓存和处理机都有着工作的极限,当网络的需求超过他们的工作极限时,就出现了拥塞。拥塞控制就是为了防止过多的数据注入到网络中,这样可以使网络中的路由器或链路不致过载。

 

5. HTTP协议包括哪些请求

GET, POST 和 HEAD方法

OPTIONS, PUT, DELETE, TRACE 和 CONNECT

 

6.TCPUDP的区别?

(1)TCP面向连接;传输可靠,保证数据顺序;首部开销20字节;面向字节流;每一条TCP连接只能是点到点的。

(2)UDP是无连接的;传输不可靠,数据无序;首部开销8个字节;面向数据报;支持一对一,一对多,多对一和多对多的交互通信

 

7.输入一个URL后发生了什么?

1)输入网址;

2)发送到DNS服务器,并获取域名对应的web服务器对应的ip地址;

3)与web服务器建立TCP连接;

4)浏览器向web服务器发送http请求;

5)web服务器响应请求,并返回指定url的数据(或错误信息,或重定向的新的url地址);

6)浏览器下载web服务器返回的数据及解析html源文件;

7)生成DOM树,解析css和js,渲染页面,直至显示完成;

 

8.常用协议端口 80用于什么协议

http

 

9.三次握手过程?

第一次握手:客户端发送SYN J(SYN=1,seq=J)到服务器(同步信号假设序号为J),进入SYN_SEND状态,等待服务器确认;

第二次握手:服务器收到客户端的SYN包,发送确认信号ACK J+1(ACK=1,ask=J+1),同时发送一个SYN K(SYN=1,seq=K),即SYNACK,此时服务器进入SYN_RECV状态;

第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK K+1(ASK=1,ack=K+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。随后Client与Server之间可以开始传输数据了。

 

10.Tcp协议是什么?TCP头部和数据部分是不是等长的?

TCP是一种面向连接的、可靠的、 基于IP的传输层协议。

 

11.发邮件用什么协议,tcp特性

常用的电子邮件协议有SMTPPOP3IMAP4

确认应答、超时重传、流量控制、拥塞控制

 

12.在一个浏览器中再点击一个标签跳转到另一个页面是怎么工作的?是重新打开一个链接吗?是哪一个字段控制长连接的?

13.http文本类型有哪些?对应的字段

14.在百度搜索页面,输入一个词,点击搜索。对应7层模型中过程。

 

Linux

1.常用的一些linux的命令,llls的区别

ll会显示当前目录下的文档详细信息(包括权限、所属用户和组、大小、时间、名称等),ls只显示当前目录下的文档名。

 

数据结构

1.堆和栈的区别?

(1)结构不同

栈:一种先进后出的数据结构。

堆:堆可以被看成是一棵树,如:堆排序。

(2)管理方式不同;

栈:编译器自动分配和释放,

堆:程序员手动分配和释放。

(3)空间大小不同;

栈:内存空间是连续的,最大空间是确定的;

堆:内存空间是不连续的,内存空间几乎没有限制。

(4)能否产生碎片不同;

  栈:内存空间是连续的,不会产生零碎的空间

  堆:内存空间不连续,造成大量的碎片,使程序效率降低

(5)生长方向不同

栈:生长方向是向下的,是向着内存地址减小的方向增长。(向低地址方向增长)

  堆:生长方向是向上的,也就是向着内存地址增加的方向;(向高地址方向增长)
(6)分配方式不同;

  堆:动态分配,手动释放

  栈:静态分配和动态分配。静态分配是编译器完成的,比如局部变量的分配。动态分配由alloca函数进行分配,由编译器进行释放。

(7)分配效率不同;

  栈的效率比较高,堆的效率比栈要低得多

 

 2.二叉树的使用场景

(1)哈夫曼编码

(2)c++ STL中的set、map容器

(3)路由器中的路由搜索引擎。

 

3. 快速排序、堆排序原理、冒泡排序,最好和最坏的情况下时间复杂度是多少

招银面经

 

4. 数组和链表的区别

(1)数组在分配内存的时候是一块连续的空间,并且每个元素的内存是一样的,因此可以用下标快速访问;链表的每个元素使用指针相互链接,分配的空间比较自由,每个元素可以不同类型不同大小,不可以用下标访问

(2)数组插入或者删除的操作就比较麻烦,要移动别的元素的位置,因此需要快速访问存取并且不频繁增删就用数组;链表插入删除比较方便

 

5. 双向链表优点

优点:可以找到前驱和后继,可进可退;

缺点:增加删除节点复杂。

 

6.链表、二叉树、哈希的查找复杂度

招银面经

 

 

操作系统

1.为什么引用多进程

安全、稳定

 

2. 进程和线程分别是什么?进程和线程的区别?进程间通信的有哪几种方式

进程是系统中正在运行的一个程序,程序一旦运行就是进程。

线程是进程的一个特定执行路径。

区别:

(1)线程是程序执行的最小单位,进程是操作系统分配资源的最小单位;

(2)一个进程由一个或多个线程组成,线程是一个进程中代码的不同执行路线;

(3)进程之间相互独立,但同一进程下的各个线程之间共享程序的内存空间(包括代码段,数据集,堆等)及一些进程级的资源(如打开文件和信号等),某进程内的线程在其他进程不可见;

(4)调度和切换:线程上下文切换比进程上下文切换要快得多。

 

进程的通信机制:管道、有名管道、消息队列、信号量、共享空间、信号、套接字。

 

3.进程互斥和进程同步

在操作系统中,当某一进程正在访问某一存储区域时,就不允许其他进程进行读写或者修改该存储区的内容,否则就会发生后果无法估计的错误。进程之间的这种相互制约的关系称为进程互斥。

并发进程在一些关键点上可能需要互相等待与互通消息,这种相互制约的等待与互通信息称为进程同步。

 

场景题

1.你觉得什么样的代码的是好的代码,项目成员之间是如何沟通合作

 

2.怎么看待测试开发,测试和开发结合起来的意义?

为测试人员开发工具

测试和开发同步进行,能够尽早发现软件缺陷,降低软件开发的成本。

 

3.一百万个网页如何去重?

 

共享单车的开锁原理知道吗?

 

代码

1.递归写n

招银面经

 

2.leetcode283----移动 0 (简单题)

招银面经

 

3.统计字符串字符再按字典顺序输出,然后一直问还有没有改进空间

招银面经

 

4.给一个偶数,求和为该偶数且差值最小的质数对

招银面经

 

5.翻转链表(剑指offer24

招银面经

 

6.两个队列实现栈,两个栈实现队列

 

7.给一个txt文件,输出文件中每个单词的出现次数

https://blog.****.net/Gorgeous_mj/article/details/90317704

 

8.字符串分割

9.两个列表合并去重

10.写一个get_Str 方法,给一个字符串“abcdefgh”按照1,2,3..间隔来划分,输出

 

智力题

1.一元钱买一瓶水,2个盖子换一瓶水。20块能买几瓶水?

2个盖子还一瓶水,所以一个盖子0.5元

1*x=20+0.5*x    x=40