1、数组与链表
1)数组与链表的区别
数组在内存顺序排列,通过改变数组大小实现
链表用指针实现,上一个元素的引用指向下一个元素的存储结构,在内存中不连续。链表就是将一系列不连续的内存联系起来,将那种碎片内存进行合理的利用,解决空间的问题。所以,链表允许插入和删除表上任意位置上的节点,但是不允许随即存取。
2、bst树、avl树、rb树、b树、b+树的相关
1)二叉树、满二叉树、完全二叉树、完美二叉树的区别?
二叉树->满二叉树->完全二叉树->完美二叉树:在形状上要求越来越严格
2)bst树、avl树、rb树、b树、b+树是什么?
(bst树、avl树、rb树、b树、b+树)->(搜索二叉树、平衡二叉树、红黑树、平衡的多叉查找树、plus版的b树)
3)bst树、avl树、rb树、b树、b+树适用场景
bst树 -> avl树 -> rb树:多叉搜索树,平衡性越来越高,适合内存中使用
b树->b+树:多叉搜索树,适合磁盘中使用
BST,AVL树,红黑树,B树,B+树,B*树(从map的底层实现到mysql索引原理)
4)红黑树五个特性?搜索、插入、删除操作如何实现以及时间复杂度?
5)B+树的优势
6)bst的第k个节点
三、Redis
1、redis数据结构:
String、LinkedList、HashMap、Set、ZSet
考察基础知识:Redis五种数据结构
2、数据淘汰机制:
定时删除、惰性删除、定期删除
考察:Redis的过期机制
3、如果Redis有1亿个key,使用keys命令是否会影响线上服务?
执行keys命令,redis会锁定,如果数据庞大的话可能需要几秒或更长,对于生产服务器上锁定几秒这绝对是灾难了
考察Keys命令性能问题:关于redis的keys命令的性能问题
4、Redis持久化方式,aod和rdb,具体怎么实现,追加日志和备份文件,底层实现原理的话知道么?
5、Redis分布式锁
四、Http协议
1、http请求完整过程
域名解析-建立tcp连接(3次握手)-浏览器发送http请求-服务器响应http请求-浏览器得到html代码-浏览器解析html代码-请求HTML代码中的资源-关闭tcp连接(四次挥手)-浏览器对页面进行渲染
2、http状态码:
分别说下:100、200、300、400、500、501、502、503、504的代表的含义
分类 | 分类描述 |
---|---|
1** | 信息,服务器收到请求,需要请求者继续执行操作 |
2** | 成功,操作被成功接收并处理(成功表示服务器成功接收了请求但未必进行处理) |
3** | 重定向,需要进一步的操作以完成请求 |
4** | 客户端错误:请求包含语法错误或无法完成请求 |
5** | 服务器错误:服务器在处理请求的过程中发生了错误 |
3、DNS是什么?HTTPDNS与DNS的区别?
DNS:域名解析,过程(浏览器缓存-操作系统缓存-本地域名服务器LocalDNS-根域名服务器)
HttpDNS:根据http请求获取域名的真实ip地址,解决LocalDNS的流氓行为
4、如何加速网络链接
使用长连接
5、如何维持长连接?
6、如何发送心跳包?
7、拥塞避免算法
8、get与post请求的区别
get与post本质上无区别,都是基于tcp/udp的http请求
get:参数放在url中,只发送一次请求,http header和data一并发送出去,服务器响应200(返回数据)
post:参数放在request body中,发送两次请求,浏览器先发送header,服务器响应100 continue,浏览器再发送data,服务器响应200 ok(返回数据)。
五、Mysql
1、mysql实现事务的原理
2、Mysql索引的实现,innodb的索引原理?,myisam索引原理?b+树的索引是怎么实现的?
Mysql采用B+Tree数据结构实现索引:B+Tree只在最末端叶子节点存数据,叶子节点是以链表的形势互相指向的。
myisam索引:创建索引时会创建索引文件、数据文件、数据结构类型3个文件,叶子节点中存储的是数据地址,当找到叶子节点时会根据叶子节点存储的数据地址取数据
innodb的索引:创建索引时会创建索引文件、数据文件2个文件,叶子节点中存储的是数据值,寻找到叶子节点时,直接找到数据的值,如果不是主键索引,则叶子节点存储的是主键id
3、为什么用b+树做索引节点,一个节点存了多少数据,怎么规定大小,与磁盘页对应
因为B+Tree只在最末端叶子节点存数据,叶子节点是以链表的形势互相指向的。
4、主从同步如何实现?
5、sql语句
1)创建表、字段的sql
DROP TABLE 名字 //删除表
CREATE TABLE 名字(列名 数据类型,列明 数据类型) //创建表和列
2)查第10-20的关键字:limit
select * from tablename limit 9,10 #返回第10-20行数据
3)表a插入表b的语句
# 整表插入
insert into t_b(select * from t_a)
# 插入指定字段
insert into t_b (col1, col2) (select col1, col2 from t_a)
六、Linux命令
1、查看端口号占用情况
lsof -i:端口号
lsof(list open files)是一个列出当前系统打开文件的工具
2、查看文件最后50行
tail -n 50 filename
3、查看cpu和内存的命令
top、ps、free
4、log日志,打印ip、port、message等信息,如何根据ip过滤日志记录条数(ip可能会重复)
七、测试用例设计
测试用例设计题主要是从功能,性能,安全,稳定,扩展,兼容等几个方面进行分析
1、百度搜索测试用例
2、B/S架构网站登陆页面测试用例设计
3、抖音注册测试
4、抖音同城功能测试
能否准确定位、试试更新定位、定位多大范围内为同城、搜索同城用户
5、测试发送图片的功能
1)功能
- 图片大小测试:0k大小图片发送、正常要求范围的图片、超越大小上限的图片发送(大于1m)
- 图片格式测试:png、jpg、gif、bmp
- 图片名称测试:正常字符、带有特殊字符、超长字符、字符中带有注入的sql代码或者js代码、
- 查看上传的图片是否正常显示、显示时是否压缩、图片是否可以缩放
- 不选择图片直接上传、发送的图片能否正常删除、是否支持多张图片同时上传
2)性能
- 并发调用该接口,支持的最大并发数3
3)安全性
- 图片是否可以通过url直接、图片是否加密传输
- 请求图片数据是否经过身份认证
6、视频加载失败如何测试
- 1)网络连接是否正常
- 2)测试小视频的加载
- 3)Adobe Flash Player下载
7、朋友圈显示的测试案例
1)功能:
- 浏览:朋友圈内容的准确性、正常滑屏浏览操作
- 刷新:下拉刷新操作
- 点赞、取消点赞、多次点赞取消点赞、最多可以多少次点赞/取消点赞
- 评论朋友圈文字,回复评论
2)性能:
- 最多支持多人并发调用朋友圈查询接口
- 初始缓存多少条朋友圈、最多缓存多少条朋友圈、没有缓存时的加载速度、最多可以浏览器多少条朋友圈
3)安全:
- 调用朋友圈接口时是否经过二次鉴权
- 朋友圈内容是否加密传输
- 敏感词的控制
4)稳定性
- 朋友圈服务的CPU、内存等硬件资源消耗的监控
5)兼容
- IOS系统:不同iphone版本、不同ios版本、不同ipad版本
- Andriod系统:不同厂商的手机、不同版本
8、针对微信电话设计测试用例
1)功能
- 拨通、拨通前取消、
- 拨通前免提、拨通前取消免提、拨通后免提、拨通后取消免提
- 拨通前静音、拨通前取消静音、拨通后静音、拨通后取消静音
- 拨通前页面的缩放、拨通后页面的缩放、
- 挂断
- UI:接通前的友好提示信息,接通后的提示信息,头像显示
2)可靠性
- 网络较差时无法拨通的异常情况处理
- 对方长时间不接通的异常情况处理
- 接通语音电话时,手机电话、其他好友语音电话、其他好友视频电话进来
- 语音电话接通过程中断网
3)性能
- 网络正常情况下的延时
- 网络较差时,语音电话的卡顿程度
- 断网时
4)安全
- 身份认证机制
- 语音数据加密传输
- 防窃听机制
5)稳定性
9、针对12306设计测试用例
10、对即将上线的哇哈哈矿泉水进行测试用例设计
1)功能
- 水瓶的材料、溶剂、瓶身厚度、瓶盖大小、瓶盖开启方式、瓶盖密封成都、瓶子颜色和透明度、承受最高温
2)性能
- 验证功能实现的效率高低
- 水瓶出水的流畅度
- 倾斜多少角度开始出水
3)稳定性
- 在不同温度下(正常室外温度、冬天室外、夏天室外、冰箱冷冻室、极限高温、极限低温),瓶盖是否能咬合紧密
- 跌落多次瓶身是否会变形(注意不同高度、瓶身水位不同、地面不同的情况进行交叉验证)
4)可靠性
- 反复打开瓶盖,在合理次数范围内,瓶盖是否依然可以正常扭紧,不漏水
5)安全性
- 瓶嘴的安全性、瓶盖开启过程的安全性、是否对儿童友好
- 加入开水是否会烫伤用户,是否有醒目的安全提示说明文字
- 瓶身材料在常温、高温、酸、碱情况下是否会渗透对人体有害的元素
- 瓶身材质是否可降解
6)兼容性
- 除了可以装水,是否可以放入其他液体,比如碳酸饮料、果汁、牛奶、酱油醋等等
- 水瓶的体积和外形是否可以放入包中、车中等
八、其他测试
1、接口测试问题解决
2、如何对上述代码进行单元测试
九、计算机网络
1、tcp协议
2、tcp三次握手和四次挥手?
1)三次握手:为了确认双方各自的接受和发送能力是否正常(服务端需要确认服务端和客户端、客户端也需要确认服务端和客户端的收发能力)
- 第一次握手:客户端给服务器端发送一个SYN报文;
- 第二次握手:服务器收到SYN报文之后,会应答一个SYN+ACK报文。
- 第三次握手:客户端收到SYN+ACK报文之后,会回应一个ACK报文。
- 服务器收到ACK报文之后,三次握手建立完成。
·第一次握手:客户端发送网络包,服务器收到了。服务器断就能得到结论:客户端的发送能力、服务端的接收能力是正常的。
·第二次握手:服务端发包,客户端收到了。客户端就能得出结论:服务端的接收能力、发送能力,客户端的接收、发送能力是正常的。不过此时服务器并不能确认客户端的接收能力是否正常。
·第三次握手:客户端发包,服务器端收到了。服务端得出结论:服务器自己的发送能力,接收能力正常。
2)四次挥手:
3、tcp与udp的区别
UDP | TCP | |
---|---|---|
是否连接 | 无连接 | 面向连接 |
是否可靠 | 不可靠传输,不使用流量控制和拥塞控制 | 可靠传输,使用流量控制和拥塞控制 |
连接对象个数 | 支持一对一,一对多,多对一和多对多交互通信 | 只能是一对一通信 |
传输方式 | 面向报文 | 面向字节流 |
首部开销 | 首部开销小,仅8字节 | 首部最小20字节,最大60字节 |
适用场景 | 适用于实时应用(qq聊天、在线视频、网络语音电话、视频会议、直播等即时通讯、广播通信等) | 适用于要求可靠传输的应用,例如文件传输、收发邮件、远程登录 |
目前常见的直播方案都是上行采用rtmp;下行采用http-flv或者hls,底层都是tcp。UDP理论上更适合用于直播系统,但开发效率低,周期长。
抖音底层用的什么传输协议TCP,还是UDP?:为适应弱网都基于UDP做可靠传输,本质上既不是TCP也不是UDP。
4、同步IO、异步IO、阻塞IO、非阻塞IO
5、xss攻击
七、Python
1、Python中的列表和元组有什么区别?
Q6、如何在Python中管理内存?
python中的内存管理由Python私有堆空间管理。所有Python对象和数据结构都位于私有堆中。程序员无权访问此私有堆。python解释器负责处理这个问题。
Python对象的堆空间分配由Python的内存管理器完成。核心API提供了一些程序员编写代码的工具。
Python还有一个内置的垃圾收集器,它可以回收所有未使用的内存,并使其可用于堆空间。
Q11、python是否区分大小写?
是。Python是一种区分大小写的语言。
Q15、Python数组和列表有什么区别?
Python中的数组和列表具有相同的存储数据方式。但是,数组只能包含单个数据类型元素,而列表可以包含任何数据类型元素。
Q17、什么是__init__?
__init__是Python中的方法或者结构。在创建类的新对象/实例时,将自动调用此方法来分配内存。所有类都有__init__方法。
Q18、什么是lambda函数?
lambda函数也叫匿名函数,该函数可以包含任意数量的参数,但只能有一个执行操作的语句。
Q19、Python中的self是什么?
self是类的实例或对象。在Python中,self包含在第一个参数中。但是,Java中的情况并非如此,它是可选的。它有助于区分具有局部变量的类的方法和属性。init方法中的self变量引用新创建的对象,而在其他方法中,它引用其方法被调用的对象。
Q21、[:: - 1}表示什么?
[:: - 1]用于反转数组或序列的顺序。
Q22、如何在Python中随机化列表中的元素?
可以使用shuffle函数进行随机列表元素。举例如下:
Q23、什么是python迭代器?
迭代器是可以遍历或迭代的对象。
Q24、如何在Python中生成随机数?
random模块是用于生成随机数的标准模块。该方法定义为:
Q29、你如何把字符串的第一个字母大写?
在Python中,capitalize()函数可以将字符串的第一个字母大写。如果字符串在开头已经包含大写字母,那么它将返回原始字符串。
Q32、什么是Python中的文档Docstrings?
Docstrings实际上不是注释,它们是文档字符串。这些文档字符串在三引号内。它们没有分配给任何变量,因此有时也用于注释。
Q33、operators中的is、not和in各有什么功能?
Operators是特殊函数,它们比较一个或多个值并产生相应的结果。其中is:当2个操作数为true时返回true(例如:“a”是'a')
not:返回布尔值的倒数
in:检查某个元素是否存在于某个序列中
Q38、为什么使用* args,** kwargs?
当我们不确定将多少个参数传递给函数,或者我们想要将存储的列表或参数元组传递给函数时,我们使用* args。**当我们不知道将多少关键字参数传递给函数时使用kwargs,或者它可以用于将字典的值作为关键字参数传递。标识符args和kwargs是一个约定,你也可以使用* bob和** billy。
Q41、什么是负指数,功能是什么?
Python中的序列是索引的,它由正数和负数组成。积极的数字使用'0'作为第一个索引,'1'作为第二个索引,进程继续使用。
负数的索引从'-1'开始,表示序列中的最后一个索引,' - 2'作为倒数第二个索引,序列像正数一样前进。
负索引用于从字符串中删除任何换行符,并允许该字符串除了作为S [: - 1]给出的最后一个字符。负索引还用于显示索引以正确的顺序表示字符串。
Q46、如何将值添加到python数组?
可以使用append(),extend()和insert(i,x)函数将元素添加到数组中。
Q47、如何删除python数组的值?
可以使用pop()或remove()方法删除数组元素。这两个函数之间的区别在于前者返回已删除的值,而后者则不返回。
七、java
1、数组、链表、哈希表的使用场景,时间复杂度
哈希表现在很少使用
2、LinkedList与ArrayList的区别
ArrayList:基于动态数组的数据结构,对于随机访问get和set,ArrayList觉得优于LinkedList,因为LinkedList要移动指针。
LinkedList:基于链表的数据结构,对于新增和删除操作add和remove,LinedList比较占优势,因为ArrayList要移动数据。
LinkedList几乎总是一个(性能)错误。为什么LinkedList糟透了:它使用大量小内存对象,因此会影响整个过程的性能。很多小对象都不利于缓存局部性。任何索引操作都需要遍历,即具有O(n)性能。这在源代码中并不明显,导致算法O(n)比ArrayList使用的算法慢。获得良好的表现是棘手的。即使大O性能相同ArrayList,但无论如何它可能会明显变慢。LinkedList在源代码中看到它很不耐烦,因为它可能是错误的选择。
ArrayList 和 LinkedList 的区别(底层数据结构): 什么时候使用arrayList,什么时候使用LinkedList (一个小时)
3、Hashmap?ConcurrentHashMap?什么情况用HashMap什么时候用ConcurrentHashMap?
hashmap采用数组+链表+红黑树的存储结构
4、扩容:LinkedList、ArrayList、HashMap如何扩容?
ArrayList:初始为10,不够就扩容,每次扩大1.5倍
LinkedList:无初始大小,也不需要扩容
HashMap: 初始化大小是 16 ,扩容因子默认0.75,每次扩大两倍
ArrayList,HashMap,LinkedList 初始化大小和 扩容机制
5、Hashmap怎么处理数据冲突?怎么高效率的实现数据迁移?
6、ConcurrentHashMap在java7与java8中的区别?
7、为什么java并发效率更好?
8、java GC机制?GC Roots有哪些?
八、C语言
1、空指针、野指针
空指针: 没有存储任何内存地址的指针就称为空指针(NULL指针)
野指针:"野指针"不是NULL指针,是指向"垃圾"内存(不可用内存)的指针。形成原因是对象销毁后,指针没有置空
2、内存泄漏
- 内存分配未成功,却使用了它
- 内存分配虽然成功,但是尚未初始化就引用它
- 内存分配成功并且已经初始化,但操作越过了内存的边界
- 忘记了释放内存,造成内存泄露
3、C和C++的区别