目录
目录
计算机网络
- TCP三次握手时,第一次传的报文段 SYN报文段(SYN=1的报文段)
- TCP为什么要三次握手呢,两次握手可以吗 首先,我们要明确一点,两次握手也是可以建立连接的,三次握手的作用就是防止特殊情况下,比如网络问题,客户端之前发送的连接请求被服务器端接收,但其实这时候客户端是没有数据发送的,这样就造成资源的浪费。第三次握手就是防止这种情况的发生
- session与cookie的区别 cookie是浏览器访问服务器端时,服务器端给客户端response的一个cookie,由客户端也就是浏览器保存 session 客户端浏览器访问服务器的时候,服务器把客户端的信息记录在服务器上 安全性:cookie 没有session安全 性能:cookie的性能更高,因为当访问增多时,大量的session保存在服务器端,影响服务器端的性能
- HTTP的报文段是什么样的
请求方法,url,协议版本,请求头,请求行,请求正文
- 请求方法
GET:请求获取Request——URL所标识的资源
POST:在Request——URL所标识的资源后附加资源
HEAD:请求获取由Request——URL所标识的资源的响应消息报头
PUT:请求服务器存储一个资源,由Request——URL作为其标识
DELETE:请求服务器删除由Request——URL所标识的资源
TRACE:请求服务器回送收到的请求信息(用于测试和诊断)
CONNECT:保留
OPTIONS:请求查询服务器性能
URL URI全名为Uniform Resource Indentifier(统一资源标识),用来唯一的标识一个资源,是一个通用的概念,URI由两个主要的子集URL和URN组成。URL全名为Uniform Resource Locator(统一资源定位),通过描述资源的位置来标识资源。URN全名为Uniform Resource Name(统一资源命名),通过资源的名字来标识资源,与其所处的位置无关,这样即使资源的位置发生变动,其URN也不会变化。
协议版本 格式为HTTP/主版本号.次版本号,常用为:HTTP/1.1 HTTP/1.0
请求头部
Host:接受请求的服务器地址,可以是IP或者是域名
User-Agent:发送请求的应用名称
Connection:指定与连接相关的属性,例如(Keep_Alive,长连接)
Accept-Charset:通知服务器端可以发送的编码格式
Accept-Encoding:通知服务器端可以发送的数据压缩格式
Accept-Language:通知服务器端可以发送的语言
Get 和 Post 的区别
1.url可见性 :
get :参数url可见 post:url参数不可见
2.数据传输上:
get通过拼接url进行传递参数 post通过body体传输参数
3.缓存性:
get请求是可以缓存的 post请求不可以缓存
4.后退页面的反应:
get请求页面后退时,不产生影响
post请求页面后退,会重新提交请求
状态码
1xx (信息状态码) 接受的请求正在处理
2xx (成功状态码)请求正常处理完毕
3xx (请求被重定向) 需要进行附加操作以完成请求
4xx (客户端错误) 服务器处理请求出错
5xx (服务端错误) 服务器处理请求出错
2XX 请求成功
200 OK 请求在服务器端被正常处理了
204 NoContent 返回的报文中不含实体的主体部分
206 PartrialContent 响应的报文内包含由Content-Range指定范围的实体内容
3XX 重定向
301 MovedPermanently 永久重定向,301状态码表示请求资源已经分配了新的URL,以后请求该资源该访问新的URL
302 Found 临时重定向,302表示请求的资源已经被分配了新的URL,希望客户端本次能使用新的URL访问
303 SeeOther 表示由于请求对应的资源存在着另一个URL,应使用GET方法定向获取请求的资源
304 NotModified 表示客户端发送附带条件的请求时,服务器端允许访问资源,但未满足条件的情况
307 TemporaryRedirect 临时重定向,和302Found状态码有相同的含义,区别在于307不会强制浏览器将POST方法改为GET方法,而是遵循浏览器自身的标准
4XX 客户端错误
400 BadRequest 表示请求报文中存在语法错误
401 Unauthorized 表示发送的请求需要有HTTP认证的认证信息
403 Forbidden 表明对请求资源的访问被服务器拒绝
404 Not Found 表示服务器上无法找到请求资源
5XX 服务器端错误
500 Internal ServerError 表明服务器端在执行请求时发生了错误
503 Service Unavailable 表明服务器暂时处于超负载或正在进行系统维护
输入URL后的全过程
域名解析,得到对应的IP地址
浏览器搜索自己的DNS缓存,若没有,则操作系统将域名发送至本地域名服务器,查找成功则返回结果,否则本地域名服务器向根域名服务器发起请求
建立TCP连接(3次握手)
浏览器向服务器发送HTTP请求
浏览器发送响应数据给客户端
浏览器解析http response
OSI七层模型
应用层 HTTP,HTTPS
表示层
会话层
传输层 TCP,UDP
网络层 IP 数据单位 数据包
数据链路层 数据单位 帧
物理层 数据单位 bit
java
- 判断字符c是否是数字字符,是则返回true ,不是则返回false Character.isDigit(char c)
- 判断字符c是否是字母或数字字符,是返回true,否则返回false Character.isLetterOrDigit(char c)
- 判断字符c是否为字母并且为小写字母 Character.isLowerCase(char c)
- 判断字符c是否为字母并且为大写字母 Character.isUpperCase(char c)
- 链表和数组的区别
- 数组 时间复杂度为O(1) 链表时间复杂度为 O(n)
- 数组是顺序的存储结构,链表是链式的存储结构
- 数组适合查询 链表适合 插入和删除操作2
- java 中的基本数据类型 byte(1字节) short(2字节) int(4字节) long(8字节) float(4字节) double(8字节) boolen(1字节) char(2字节) 引用类型 类,数组,接口
- 深拷贝 与 浅拷贝
- 浅拷贝就是 用clone 方法 复制了引用类型的对象(在栈中) ,但其实还是指向了 同一个内存空间(堆)
- 深拷贝 开辟了新的内存空间(在堆中) 利用序列化 将对象写到流中,反序列化 把对象从流中读取出来
- try{ //正常执行的代码 }catch (Exception e){ //出错后执行的代码 }finally{ //无论正常执行还是出错,之后都会执行的代码 } //跟上面try catch无关的代码 正常执行的代码如果出现异常,就不会执行出现异常语句后面的所有正常代码.
- java中的数据类型 基本类型:byte、short、int、long、float、double、boolean 引用类型:类、数组、接口 ...
- StringBuilder 不是线程安全的
- java中的线程安全:就是线程同步的意思,当一个程序对一个线程安全的方法或者语句进行访问的时候,其他不能再对他进行操作了,必须等到这次访问结束以后才能对这个线程安全的方法进行访问
MySQL
- union 与 union all 的区别
- Union:对两个结果集进行并集操作,不包括重复行,同时进行默认规则的排序
- Union All:对两个结果集进行并集操作,包括重复行,不进行排序
- 简单来说就是 union 去重且排序 union all不去重且不排序
- 怎么查看重复的记录 使用count 函数 来统计
- regexp ^ 以字符串开始 比如^a 就代表以字母a开头的字符串
- 多表查询 select * from 表1 inner join 表2 on 表1.字段 = 表2.字段
- 创建表 create table 表名(字段名 字段类型)
- 插入数据 insert into 表名 values(值,值.....)
- 修改数据 update 表名 set 字段 = 值 where 条件
- 删除记录 delete from 表名 where 条件
- 删除表 drop table 表名
- 约束 主键primary key 非空not null 唯一unique 默认值default
- distinct 过滤重复记录 select distinct 字段名 from 表名
- order by 排序 DESC:从大到小 ASC:从小到大
- 聚合函数 count:select返回的记录总数 max:查询最大值 min:查询最小值 sum:求和 avg:求平均数
- select * from 表名 where 条件 group by 字段 order by 字段 limit
- 事务 begin:开始事务 rollback:回滚事务,放弃对表的修改 commit :提交事务,对表的修改生效
- 索引: 创建索引 create index 索引名 on 表名(字段)
- 删除索引:drop index 索引名 on 表名
- 查询结果去重 select 列名 from 表名 group by 列名
- 查询结果限制返回行数,比如限制两行 select 列名 from 表名 limit 2
- 将查询后的列重新命名 select 列名 新列名 from 表名
- 将查询后的多列进行排序 select 列名1,列名2 from 表名 order by 列名1,列名2
- 将查询后的多列进行降序排列 select 列名1,列名2 from 表名 order by 列名1 DESC,列名2 DESC
- 修改表的数据类型 alter table 表名 modify 字段名 新字段类型(新字段长度)
并发事务对数据库带来的问题
丢失更新
脏读:读取到修改但未提交的数据
不可重复读
幻读:读取到新增且已提交的数据
其中丢失更新可以通过对数据加锁(行级锁)来解决 脏读、不可重复读、幻读可以用事务隔离机制来解决
事务的特性:原子性、一致性、隔离性和持久性
数据库的隔离级别
脏读 不可重复读 幻读 (√ 可能出现,×是不会出现)
读未提交 √ √ √
读已提交 × √ √
可重复读 × × √
串行化 × × ×
Innodb存储引擎和MyISAM存储引擎的区别
InnoDB 支持事务,MyISAM不支持
InnoDB支持外键,MyISAM不支持
清空整个表时,InnoDB是一行一行的删除,效率慢,MyISAM则会重建表
锁的级别
表级锁 不会出现死锁 并发度最低
行级锁 会出现死锁 并发度最高
页面锁 会出现死锁 并发度一般
MySQL锁的分类
共享锁(S锁) 对数据进行读操作 因此多个事务可以同时为一个对象加共享锁
排他锁(X锁) 对数据进行锁操作 一个事务对对象加了排他锁,其他事务就不能再给他加任何锁了
行锁 对一行记录加锁,只影响一条记录
意向锁(表级) 意向共享锁,意向排他锁
linux
- 给linux配置一个IP地址 netconfig 命令
- 查看环境变量 echo $PATH
- 如何添加环境变量
- vi ~/.bashrc
- export PATH="$HOME/bin:$PATH"
- source ~/.bashrc
- 查找指定文件 find / -name 文件名
- 查看端口 netstat -lntup
- 查看进程 ps -aux
- 杀死某个进程 kill - 9 进程号
- 查看CPU的型号、类型及大小 cat /proc/cpuinfo
- 查看内存使用情况 free -m 以mb为单位显示内存的情况
- 实时的显示系统中各个进程的资源占用情况 top -c
- 显示磁盘的使用量和占用率 df -h
- 查看一个文件的最后十行 tail -n 10
- 查看一个文件的前十行 head -n 10
- linux主机之间传输文件,将本地文件拷贝到远程 scp 文件名 -用户名@计算机IP
- 查询服务器已经运行多久 Uptime
- 识别文件类型 file
- 文件重命名 mv 原始文件名 新文件名
- vim中高亮搜索 :set hlsearch 然后再 / + 关键字 搜索
- 批量替换文件中的内容 sed -i "s/旧内容/新内容/g" 文件路径
- 查找子目录中带有关键字的文件 grep -r 关键字 目录
测试
- alpha测试和beta测试的区别
- α是第一阶段,一般只供内部测试使用;
alpha测试 (由用户、测试人员、开发人员共同参与的内部测试,注意测试员和程序员只是在现场,而测试需要用户来完成) - β是第二个阶段,已经消除了软件中大部分的不完善之处,但仍有可能还存在缺陷和漏洞,一般只提供给特定的用户群来测试使用;
beta测试 (内测后的公测,交给最终用户测试 (俗称甲方),公司外部展开的测试,可以由非专业的测试人员执行的测试,注意开发人员和测试人员都不在现场) - λ是第三个阶段,此时产品已经相当成熟,只需在个别地方再做进一步的优化处理即可上市发行。
- α是第一阶段,一般只供内部测试使用;
- 白盒测试的几种方法概念
语句覆盖 主要特点:语句覆盖是最起码的结构覆盖要求,语句覆盖要求设计足够多的测试用例,使得程序中每条语句至少被执行一次。
判定覆盖 主要特点:判定覆盖又称为分支覆盖,它要求设计足够多的测试用例,使得程序中每个判定至少有一次为真值,有一次为假值,即:程序中的每个分支至少执行一次。每个判断的取真、取假至少执行一次。
条件覆盖 主要特点:条件覆盖要求设计足够多的测试用例,使得判定中的每个条件获得各种可能的结果,即每个条件至少有一次为真值,有一次为假值。
判定/条件覆盖 主要特点:设计足够多的测试用例,使得判定中每个条件的所有可能结果至少出现一次,每个判定本身所有可能结果也至少出现一次。
组合覆盖 主要特点:要求设计足够多的测试用例,使得每个判定中条件结果的所有可能组合至少出现一次。
路径覆盖 主要特点:设计足够的测试用例,覆盖程序中所有可能的路径。
-
逻辑测试覆盖是白盒测试法常用的技术。主要的覆盖标准有6种 强度由弱到强依次是:语句覆盖、判定覆盖、条件覆盖、判定/条件覆盖、条件组合覆盖、路径覆盖
- 增量式集成测试
自顶向下测试:是从程序的初始模块开始测试。
(1)该方法便于在早期发现顶层的错误。
(2)早期的程序框架可以进行演示
(3)需要开发桩模块辅助测试。有些甚至需要多个桩模块辅助,加大了桩模块本来的错误影响。
(4)测试完一个上层模块后,挑选哪个模块作为下一个测试模块,以及测试的顺序没有唯一的界定标准。
优点:较早地验证了主要控制和判断点;按深度优先可以首先实现和验证一个完整的软件功能;功能较早证实,带来信心;只需一个驱动,减少驱动器开发的费用;支持故障隔离。
缺点:柱的开发量大;底层验证被推迟;底层组件测试不充分。
自底向上测试:是从程序的底层模块开始测试。
(1)I/O操作可以提前测试,更好提交测试用例。
(2)测试后比较容易观察输出。
(3)需要开发驱动模块。
(4)直到最后一个模块提交,程序才能完整的系统测试。
优点:对底层组件行为较早验证;工作最初可以并行集成,比自顶向下效率高;减少了桩的工作量;支持故障隔离。
缺点:驱动的开发工作量大;对高层的验证被推迟,设计上的错误不能被及时发现。
-
哪个测试颗粒度最大? 验收测试
-
哪些是服务器性能测试中的性能指标? 吞吐量,响应时间,CPU使用率
-
系统测试:安全,性能,压力,功能,回归
集成测试:接口测试。
-
软件验收测试包括哪些?
-
正式验收测试
-
非正式验收测试:α测试 β测试
-
-
测试的关键问题是? 如何选择测试用例
-
使用语句覆盖对下列代码进行测试用例设计
-
语句覆盖:选择足够的测试用例,使程序中的每条语句至少执行一次。所谓足够的指的是越少越好
-
-
集成测试
非增量:每个模块测试完了再连接;
增量:测一个模块,就连接一个模块。
-
系统集成测试主要包括以下过程: 1. 构建的确认过程。 2. 补丁的确认过程。 3. 系统集成测试测试组提交过程。 4. 测试用例设计过程。 5. 测试代码编写过程。 6. Bug的报告过程。 7. 每周/每两周的构建过程。 8. 点对点的测试过程。 9. 组内培训过程。
-
因果图法着重测试规格说明中的输入与输出间的依赖关系。
-
根据缺陷放大理论
单元测试能发现约80%的软件缺陷
-
负载测试 : 是通过增加系统负载,测试系统性能的变化,并在满足最终确定性能指标的情况下,系统所能承受的最大负载量的测试,是正常范围内的测试
-
压力测试 : 逐步增加系统负载,测试系统性能的变化,并最终确定在什么负载下系统性能处于失效状态
-
既可以用于黑盒测试,也可以用于白盒测试的方法的是: 边界值法
-
编写测试用例的目的是什么
从测试用例追溯回功能需求以确保没有需求被疏忽
用测试用例来验证产品需求模型的正确性
通过测试用例以确认是否达到了产品期望的要求
- 单元测试主要技术手段有
驱动代码 Stub代码 Mock代码
- 单元测试工具
PureCoverage
Purify
Quantify
- 系统测试手段
GUI测试手段
- 代码走查和单元测试的区别
代码走查:只检查代码中是否有错误。
单元测试:是指对软件中的最小可测试单元进行检查和验证。
-
疲劳测试
性能测试中的疲劳强度测试。
疲劳强度测试:
通常是采用系统稳定运行情况下能够支持的最大并发用户数或者日常运行用户数,持续执行一段时间业务,通过综合分析交易执行指标和资源监控指标来确定系统处理最大工作量强度性能的过程。
因为疲劳强度测试强调持续执行一段时间业务,故对于软件系统来讲,最容易暴露的性能故障是内存泄漏,以及内存是否不足。
-
风险曝光度
风险曝光度(riskexposure)=错误出现率(风险出现率)X错误造成损失(风险损失) 比方说有一套产品100个,一套产品10元,有60%可以使用,剩下的风险率50%,求风险曝光度 50%* 10 * 100 *(1-60%) = 风险曝光度; -
工作说明书—SOW 制定测试的进度
概要设计说明书-HLD 设计测试的用例
详细设计说明书-LLD 程序员编码实现
单元测试用例-UTC 单元测试使用
-
测试驱动开发
测试驱动开发是敏捷开发中的一项核心实践和技术,也是一种设计方法论。测试驱动开发,英文全称Test-Driven Development,简称 TDD ,是一种不同于传统 软件开发流程 的新型的开发方法。它要求在编写某个功能的代码之前先编写测试代码,然后只编写使测试通过的功能代码,通过测试来推动整个开发的进行。这有助于编写简洁可用和高质量的代码,并加速开发过程。
1.TDD的原理是在开发功能代码之前,先编写单元测试用例代码,测试代码确定需要编写什么产品代码。 2.TDD的基本思路就是通过测试来推动整个开发得进行,但测试驱动开发并不只是单纯的测试工作,而是把需求分析,设计,质量控制量化的过程。 3.TDD的重要目的不仅仅是测试软件,测试工作保证代码质量仅仅是其中一部分,而且是在开发过程中帮助客户和程序员去除模棱两可的需求。 4.TDD首先考虑使用需求(对象、功能、过程、接口等),主要是编写测试用例框架对功能的过程和接口进行设计,而测试框架可以持续进行验证。 -
关于软件测试的基本标准链接:
(1)所有的测试都应追溯到用户需求。
(2)应当把“尽早地和不断地进行软件测试”作为座右铭。
(3)pareto原则:测试发现的错误中80%很可能起源于20%的模块中。
(4)完全测试是不可能的,测试需要终止。
(5)应由独立的第三方来构造测试。
(6)充分注意测试中的群集现象。
(7)尽量避免测试的随意性。
(8)兼顾合理的输入和不合理的输入数据。
(9)程序修改后要回归测试。
(10)应长期保留用例,直至系统废弃。 -
自底向上集成需要测试员编写驱动程序(√)
-
比较判断与控制流常常紧密相关,测试时注意下列错误:
1. 不同数据类型的对象之间进行比较;
2. 错误地使用逻辑运算符或优先级;
3. 因计算机表示的局限性,期望理论上相等而实际上不相等的两个量相等;
4. 比较运算或变量出错;
5. 循环终止条件或不可能出现;
6. 迭代发散时不能退出;
7. 错误地修改了循环变量。 -
IOS单元测试框架
XCTest
GHUnit
OCMock
- 如果某测试用例集实现了某软件的路径覆盖,那么它一定同时实现了该软件的判定覆盖
判定覆盖是每个判定的真假一次,就会导致所有的结果路径会实现;
条件覆盖是每个判定里的条件各取一次,不一定会产生所有的结果;
-
静态测试包括代码检查、静态结构分析、代码质量度量等。它可以由人工进行,充分发挥人的逻辑思维优势,也可以借助软件工具自动进行。
人工测试技术主要包含三种静态测试技术,分别是代码走查、代码审查和正式评审。
-
动态分析:代码运行结束后。模块功能检查和系统压力测试,必须执行代码后才能分析。
静态分析:代码运行之前。数据流分析和代码覆盖率,不需要执行代码就可分析。
-
负载测试:在一定的工作负荷下,系统的负荷及响应时间。
强度测试:在一定的负荷条件下,在较长时间跨度内的系统连续运行给系统性能所造成的影响。
容量测试:容量测试目的是通过测试预先分析出反映软件系统应用特征的某项指标的极限值(如最大并发用户数、数据库记录数等),系统在其极限值状态下没有出现任何软件故障或还能保持主要功能正常运行。容量测试还将确定测试对象在给定时间内能够持续处理的最大负载或工作量。容量测试的目的是使系统承受超额的数据容量来发现它是否能够正确处理。容量测试是面向数据的,并且它的目的是显示系统可以处理目标内确定的数据容量。 -
loadrunner包括哪几部分? 脚本编辑工具、测试执行工具、结果分析工具
-
软件调试技术:
试探法(强行排错法);
回溯法:人工沿着程序的控制流程往跟踪代码,直到找出错误根源为止;
对分查找法:缩小错误的范围;
归纳演绎 ;
原因排除法 ;
-
项目立项前测试人员不需要提交任何工件(√) 注:工件是加工过程中的生产对象
-
软件验收测试的合格通过准则
1、软件需求分析说明书中定义的所有功能已全部实现,性能指标全部达到要求。 2、所有测试项没有残余的一级二级三级的错误。 3、立项审批表、需求分析文档、设计文档和编码实现一致。 4、验收测试工件齐全(测试计划,测试用例,测试日志,测试通知单,测试分析报告)
- 哪些测试阶段涉及到路径测试? 单元测试,集成测试
- 对手机软件的压力测试包括 存储压力,边界压力,响应能力压力,网络流量压力
- Junit 单元测试
Junit单元测试框架—基于java语言对的主流单元测试框架
@beforeClass—位于数据准备前期或者其他前期准备(测试类调用前)
--用于提取代码中的共用部分减少冗余,只能声明注解一次
--必须在public static void,方法名随意,,只运行一次。
@AfterClass—位于所有用例运行之后,处理测试后续工作。
--测试类被调用运行结束之前,只能声明注解一次。
--必须在public static void,方法名随意,,只运行一次。
@Test—在Junit3中通过对测试类和测试方法的命名来确定是否为测试
--在Junit4中,只要在方法前加@Test就行,此注解必为单元测试。
--在一个测试类可多次注解,每个只被执行一次,必须是public void
--可以抛异常
使用Assert断言
1、断言相等:assertEquals(100,x),判断对象是否为同一个
断言不相等:assertNotEquals(100,x),判断对象是否不为同一个
2、断言数组内容相等:assertArrayEquals({1,2,3},x)
3、断言浮点数相等:assertEquals(3.1416, x, 0.0001)(必须设置误差值)
4、断言为null:assertNull(x)
5、断言真伪性:assertTrue(x > 0)/assertFalse(x < 0)
6、
校准测试函数,使用操作符'=='比较实际和预期的是否重复
-
对桩函数的描述 : 桩函数(Stub)是指模拟被测试的模块所调用的模块,而不是软件产品的组成的部分。在自顶向下的集成过程中尤其有效。
-
测试工具的功能 LoadRunner-负载压力测试:预测系统性能。
JMeter+Badboy:基于JAVA的压力测试工具,Badboy用来进行脚本的录制
功能测试:通过自动录制、检测和回放用户的应用操作。将输出记录同预先给定的记录比较。
Junit:白盒测试工具:针对代码测试
测试管理工具:对测试需求、计划、用例、实施进行管理
测试辅助工具:本身不执行,可以生成测试数据,为测试提供数据准备
负载压力测试:LoadRunner:预测系统行为和性能的工业标准级负载测试工具。模拟上千万用户同时实施并发操作,来实时监控可能发生的问题。
功能测试: QTP(quicktest professional):自动测试工具
白盒测试:C++ TEST(做C和C++的白盒测试)、JUnit(Java白盒测试)
缺陷管理工具:Mantis、BugFree、QC、TD
用例管理工具:TestLink、QC
测试辅助工具:SVN -
接口测试用例 编号、标题、用例名称、优先级、预置条件、接口名称、测试方法、url、请求头、请求数据、预期结果
算法
- Floyd算法时间复杂度: O(n^3)
- BFS算法 广度优先算法(Breadth-First-Search),简称BFS,是一种图形搜索演算法,最糟糕的情况算法时间复杂度为 O(V+E)。简单的说,BFS是从根节点开始,沿着树的宽度遍历树的节点,如果发现目标,则演算终止。
- DFS算法 深度优先搜索算法(Depth First Search):一种用于遍历或搜索树或图的算法。 沿着树的深度遍历树的节点,尽可能深的搜索树的分支。属于盲目搜索,最糟糕的情况算法时间复杂度为 O(n^2)。
- 快速排序 时间复杂度:平均O(n*log n),最差O(n^2); 空间复杂度:平均O(logn),最差O(n)
- 堆 是程序运行时,而不是在程序编译时,申请的某个大小的内存空间,即动态分配内存
- 栈就相当于一个桶,后放进去的数据先拿出来(先进后出)
- 队列只能在队头做删除操作,在队尾做插入操作,而栈只能在栈顶做插入和删除操作
B+树的特点
非叶子节点上不包含真正的数据,只当做索引使用
每个叶子节点都有一个指针,指向下一个数据,形成一个有序链表
根节点至少有两个子女
软件工程
- 在规定的条件下和规定的时间间隔内,软件实现其规定功能的概率称为 可靠性
- UML的用例图一般用于描述软件系统的需求
- 在软件详细设计阶段,常用的图形描述工具有程序流程图,盒图(NS 图)和问题分析图(PAD) .常用的语言描述工具为 PDL(程序设计语言) ,常用的表格描述工具有判定表和判定树.
- 在详细设计阶段,经常采用的工具有PAD
- 结构设计是一种应用最广泛的系统设计方法,是以数据流图为基础、自顶向下、逐步求精和模块化的过程。
- 进程和线程 进程:资源分配的最小单位 线程:是进程中执行运算的最小单位,是进程中的一个实体
- 多进程 是指操作系统能同时运行多个任务(程序)
- 多线程 是指在同一个程序中有多个顺序流在执行
对多线程的理解
线程就是进程中的实际运行单位,它是操作系统中进行运算调度的最小单位。而多线程就是指一个进程中同时有多个执行路径即线程在执行
优点:可以同一个程序的不同部分并发执行
缺点:可能会造成线程死锁的情况
如何避免线程死锁?
加锁时限(超过时间限制则放弃对该锁的请求,并释放自己占有的锁)
代码
- 快速排序
public class QuickSort {
public static void main(String[] args) {
int[] a = {1,5,63,2,4,5,8};
quickSort(a,0, a.length-1);
for (int i = 0; i < a.length; i++) {
System.out.println(a[i]);
}
}
public static void quickSort(int[] arr,int left,int right){
int i = left;
int j = right;
if (i > j){
return;
}
int temp = arr[left];
while (i != j){
while ( i < j&& arr[j] >= temp){
j--;
}
while (i < j&& arr[i] <= temp){
i++;
}
if (i < j){
int a = arr[i];
int b = arr[j];
arr[i] = b;
arr[j] = a;
}
}
arr[left] = arr[i];
arr[i] = temp;
quickSort(arr,left,i-1);
quickSort(arr,i+1,right);
}
}
python
1. 字符串怎么转成字典
使用eval函数将字符串转换成字典
2.python自动化测试中常用的库
Selenium,Unittest,pytest,Appium,pytest-html