测开学习笔记

哈希表防冲突方法?

线性探测法

(1)插入元素:插入元素时,如果发生冲突,算法将从该槽位向后遍历哈希表,直到找到表中的下一个空槽,并将该值放入到空槽当中。

(2)查找元素:查找元素时,首先散列值所指向的槽,如果没有找到匹配,则继续从该槽向后遍历哈希表,直到:1)找到相应的元素;2)找到一个空槽(指示查找的元素不存在);3)整个哈希表都遍历完毕(指示该元素不存在并且哈希表已满)

线性探测法存在的缺点:

(1)处理溢出需要另编程序。一般可以设立一个溢出表,用来存放上述哈希表中放不下的记录。此溢出表最简单的结构是顺序表,查找方法可用顺序查找;

(2)删除工作很复杂。因为一旦对某一个元素删除后,该位置出现空槽,后续查找到该空槽时会认为该元素不存在。需要一种方法对删除元素进行标记;

(3)由于每次都是线性递增,容易导致堆聚,即存入哈希表的记录在表中都连成一片,后续发生冲突的可能性会越大。

二次探测法

本质和线性探测法较类似,只不过线性探测法按照1,2,3,4……的步长进行探测,二次探测法按照1,4,9,16……即平方的方式进行探测。

链地址法

也成为拉链法。其基本思路为:将所有具有相同哈希地址的而不同关键字的元素连接到同一个单链表中。如果选定的哈希表长度为m,则可以将哈希表定义为一个有m个头指针组成的指针数组。凡是给定哈希地址为i的元素,均以节点的形式插入到下标为i的头指针单链表中。并且最新的元素插入到链表的前端,这不仅因为方便,还因为一个经常发生的事实是:最新插入的元素最有可能不久又被访问。

img

对于冲突的哈希值,将其链入到该地址所对应的链表头中。

链地址法的特点:

linux查看进程

根据特定条件查询进程PID信息;

pgrep的参数:

如何中断某个进程;如何杀死某个进程

使用kill -STOP 命令将该进程暂停

使用kill -CONT恢复进程执行

http协议,实现http服务器?socket建一个服务器的操作步骤?

1、TCP协议是面向连接的、可靠的、有序的、以字节流的方式发送数据,通过三次握手方式建立连接,形成传输数据的通道,在连接中进行大量数据的传输,效率会稍低

2、Java中基于TCP协议实现网络通信的类

客户端的Socket类

服务器端的ServerSocket类

img

Socket通信的步骤

① 创建ServerSocket和Socket

② 打开连接到Socket的输入/输出流

③ 按照协议对Socket进行读/写操作

④ 关闭输入输出流、关闭Socket

服务器端:

① 创建ServerSocket对象,绑定监听端口

② 通过accept()方法监听客户端请求

③ 连接建立后,通过输入流读取客户端发送的请求信息

④ 通过输出流向客户端发送相应信息

⑤ 关闭相关资源

客户端:

① 创建Socket对象,指明需要连接的服务器的地址和端口号

② 连接建立后,通过输出流想服务器端发送请求信息

③ 通过输入流获取服务器响应的信息

④ 关闭响应资源

应用多线程实现服务器与多客户端之间的通信

① 服务器端创建ServerSocket,循环调用accept()等待客户端连接

② 客户端创建一个socket并请求和服务器端连接

③ 服务器端接受苦读段请求,创建socket与该客户建立专线连接

④ 建立连接的两个socket在一个单独的线程上对话

⑤ 服务器端继续等待新的连接

排序算法?讲一下堆排序的思想

堆排序,那么怎样实现一个从大到小的数组排序

什么是内存泄漏?怎样检测内存泄漏?

在Java中,内存泄漏就是存在一些被分配的对象,这些对象有下面两个特点,首先,这些对象是可达的,即在有向图中,存在通路可以与其相连;其次,这些对象是无用的,即程序以后不会再使用这些对象。如果对象满足这两个条件,这些对象就可以判定为Java中的内存泄漏,这些对象不会被GC所回收,然而它却占用内存。

在C++中,内存泄漏的范围更大一些。有些对象被分配了内存空间,然后却不可达,由于C++中没有GC,这些内存将永远收不回来。在Java中,这些不可达的对象都由GC负责回收,因此程序员不需要考虑这部分的内存泄露。

如何检测Java的内存泄漏。目前,我们通常使用一些工具来检查Java程序的内存泄漏问题。市场上已有几种专业检查Java内存泄漏的工具,它们的基本工作原理大同小异,都是通过监测Java程序运行时,所有对象的申请、释放等动作,将内存管理的所有信息进行统计、分析、可视化。开发人员将根据这些信息判断程序是否有内存泄漏问题。这些工具包括Optimizeit Profiler,JProbe Profiler,JinSight , Rational 公司的Purify等。

讲一下tcp的拥塞控制

实现索引的数据结构是什么?详细讲一下B+树和B树

mysql隔离级别?锁?

如何实现一个多态?

讲讲hashmap和hashtable的区别

讲讲你知道的设计模式

发朋友圈测试用例

对于一个待测试的对象,我们通常通过以下几个方面来进行测试:功能测试、可靠性测试、易用性测试、效率、可维护性、可移植性、安全性测试、界面测试等。

(1)站在测试人员的技术测试角度(功能测试、可靠性测试、兼容性、可维护性、效率、可移植性、安全性测试、可维护性)

(2)站在用户的角度(功能测试、易用性测试)

站在测试人员的技术测试角度:

1.功能测试

功能测试是软件测试中最基本的测试,功能实现不满足要求,软件就不能发布测试。要进行功能测试,首先就需要了解朋友圈的各个功能,那么如何了解朋友圈的功能呢?——需求文档。因为所有的开发设计、测试设计等,都是以需求文档来进行的。需求文档中规定了必须有哪些功能,那么我们在测试的时候就可以对比知道哪些功能实现了,还有哪些功能未实现(需要说明的是:开发计划明确说明当前版本暂不实现的功能,不能算作bug)。

相信玩过微信朋友圈的人都能知道微信朋友圈大概有以下基础功能:

1)发朋友圈、删除朋友圈,看朋友圈;

2)朋友圈的类型(图、文、混合);

3)评论朋友圈;

4)朋友圈的对外接口(例如,王者荣耀,把战绩分享至朋友圈等);

5)屏蔽与被屏蔽,不能查看对应好友的朋友圈;

............

我们做基础功能测试,就需要对朋友圈具有的所有功能进行测试。

发朋友圈:我们可以通过短按或者常按朋友圈中的照相机图标,分别发起图片版或文字版的朋友圈操作,在此过程中,我们需要关注进行发起操作的响应时间是否符合需求。然后就需要对发朋友圈进行全面的测试了,其中包括,正常发朋友圈,取消发朋友圈,多次发朋友圈等。如果需求中对朋友圈的内容有限定,例如不允许出现敏感字眼等。

2.可靠性测试

先来说一下软件可靠性的概念:软件可靠性(software reliability)是软件产品在规定的条件下和规定的时间区间完成规定功能的能力。

规定的条件是直接与软件运行相关的使用该软件的计算机系统的状态和软件的输入条件,或统称为软件运行时的外部输入条件;

规定的时间是指软件的实际运行时间区间;

规定的功能是指提供给定的服务,软件产品所必须具备的功能。

软件可靠性不但与软件存在的缺陷(或)差错有关,而且与系统输入和系统使用有关。软件可靠性的概率度量程为软件可靠度。

这里举几个朋友圈的可靠性例子:

1)短时间内频繁进行发送、取消、以及删除朋友圈的组合测试,看朋友圈相关功能是否正常;

2)微信打开后,手机锁屏或切换到主界面,微信在后台是否会失效出现bug,并且朋友圈的功能是否会失效。

3.性能测试

性能测试主要对服务器的性能进行测试的。在App上,性能测试分为客户端性能、服务器性能。

对客户端性能我们主要关注的指标有:CPU占用率、内存占用率、流量耗用量等。举个例子,如果发起朋友圈操作之前,手机的CPU使用率为30%,发起操作之后,忽然涨到了80%,不关闭朋友圈的相关操作,CPU使用率降不下来,那么对于整个朋友圈的性能问题就得需要我们去好好找原因了。

对提供朋友圈服务的服务器进行性能测试时,我们需要进行压力测试、负载测试、稳定性测试。常用的工具就是Loadrunner了,主要关注的指标有:CPU、内存、响应时间等。

4.其他测试

例如:

1)在弱信号的情况,进行发朋友圈、看朋友圈等操作,测试其是否会产生其它未知故障。(例如对WiFi信号进行限速)

2)在不同的客户端的兼容性测试,使用不同平台的客户端进行朋友圈的功能测试。(例如使用不同厂商的手机、平板)

3)安全性测试(例如在朋友圈儿中输入一些脚本程序代码什么的,测试是否会将微信客户端搞崩溃什么的。

站在用户的角度

站来用户角度来说,易用性是其评价软件好坏最主要的一点,功能操作是否简单明了,给出的提示是否清楚明白无二意,还有就是界面布局否美观合理。

除此之外,我们还要模拟不同的用户场景下的使用。把自己想象为不同的用户(小白用户,资深用户),因为不同的用户有不同的使用习惯,这也类似于发散测试,因人而异。

DNS知道吗,浏览器输入URL到返回页面

域名系统(Domain Name System缩写DNS,Domain Name被译为域名)是因特网的一项核心服务,它作为可以将域名和IP地址相互映射的一个分布式数据库。

https://zhuanlan.zhihu.com/p/79350395

vim常用命令

一个数组,能不能找出两个数加起来等于给定的数

哈希表

让这个单例类变得线程安全

中间人攻击