当前位置: 首页 > news >正文

网站应该怎么做运维免费自助建下下载

网站应该怎么做运维,免费自助建下下载,网站建设英语,洛阳做网站公司地址1. 黑盒测试方法 黑盒测试#xff1a;关注的是软件功能的实现#xff0c;关注功能实现是否满足需求#xff0c;测试对象是基于需求规格说明书。 1#xff09;等价类#xff1a;有效等价类、无效等价类 2#xff09;边界值 3#xff09;因果图#xff1a;不同的原因对应…1. 黑盒测试方法 黑盒测试关注的是软件功能的实现关注功能实现是否满足需求测试对象是基于需求规格说明书。 1等价类有效等价类、无效等价类 2边界值 3因果图不同的原因对应不同的结果 4错误猜测根据经验 5场景设计 6正交实验法状态表、分析表 7判定表不同原因不同选择组合如A原因选N、B原因选Y组合结果为GO 2. 白盒测试方法 白盒测试关注程序内部逻辑的实现白盒测试的测试对象是基于被测试程序的源代码。 1语句覆盖设计足够的测试用例使得被测程序中每条语句至少执行一次 2条件覆盖使得每一个判定获得每一种可能的结果至少一次 3判定覆盖使判定语句中的每个逻辑条件取真值与取假值至少出现一次 4判定条件覆盖使得判定语句中所有条件的可能取值至少出现一次同时所有判定语句的可能结果也至少出现一次 5条件组合覆盖使得每个判定中条件的各种可能组合都至少执行一次 6路径覆盖设计足够的测试用例使得程序中的每一条可能组合的路径都至少执行一次 3. 黑盒测试和白盒测试的区别 1黑盒测试主要针对的是程序展现给用户的功能而白盒测试则是主要针对程序的代码逻辑。前者测试最终功能而后者测试后台程序。 2测试方法不同 3黑盒测试以规格需求说明书作为参考依据而白盒测试需要以规格需求说明书以及程序设计文档等作为参考依据 无论采用哪种测试方法毫无疑问都是为了找出缺陷发现风险从而确保软件的缺陷更少质量更好。 4. 性能测试主要指标 以前后端的角度看 1前端 响应时间、加载速度、消耗的流量 2后端 响应时间关注接口、并发用户数、内存占用、吞吐量每秒事务数在没有遇到性能瓶颈时TPS并发用户数*事务数/响应时间、错误率、资源使用率CPU占用率、内存使用率、磁盘I/O、网络I/O 以测试分析角度看 1系统性能指标 响应时间、系统处理能力HPS每秒点击次数、TPS每秒处理交易次数、QPS系统每秒处理查询次数、吞吐量、并发量、错误率 2资源性能指标 CPU用户态、系统态、等待态、空闲态、内存、磁盘吞吐量、网络吞吐量 3稳定性能指标 最短稳定时间系统按照最大容量的80%或标准压力系统的预期日常压力情况下运行能够稳定运行的最短时间。 5. 测试用例万能公式 万能公式 功能性能界面兼容性容错性安全性易用性弱网安装/卸载 黑盒测试 1功能测试 展示① 排版正常不出现缺失、重叠等现象 ② 图片正常展示无明显拉伸 ③ 字体大小样式展示正确过长截断 ④ 点击跳转正常 ⑤ 用户滑动无卡顿 ⑥ 加载更多无重复 功能① 账户在登录和非登录状态下的操作 ② 用户在缺失经纬度时的距离展示 ③ 用户重复操作的结果 ④ 数量的更新 ⑤ 达到上限后需求的下线 ⑥ 时间点等条件的限制 2性能测试 ① CPU ② 内存占用 ③ 耗流量 ④ 低配置设备的体验效果 ⑤ 弱网测试 ⑥ 压测后的QPS、HPS、TPS ⑦ 并发 ⑧ 吞吐 ⑨ 错误率 白盒测试 1功能测试 ① 正向功能 ② 参数不存在 ③ 参数为空 ④ 参数类型不匹配 ⑤ 参数取值边界值 ⑥ tooken无效 ⑦ 参数格式不正确 2性能测试 ① 压力测试系统在极限压力下的处理能力 ② 狭义性能测试系统能够达到的处理能力 ③ 并发测试测试数据库和应用服务器对并发请求的处理能力 3安全性测试 ① 伪造tooken攻击 ② SQL注入攻击 ③ 循环遍历id 4其他 同一用户提交的参数信息完全一致返回结果应该是同一个 6. 如何测试一个post请求方式参数是String、int的接口 POST方法提交数据给服务器涉及到Content-Type和消息主体编码方式两部分。服务器根据请求头中的Content-Type来判断消息主体的数据格式和编码方式数据则存储在body参数中上传。 其实主要考虑以下几点 ① 请求方式 ② 无参传入 ③ 参数为空 ④ 参数类型不匹配 ⑤ 参数边界值 ⑥ body的格式类型 ⑦ tooken无效 ⑧ sql注入 ⑨ 性能测试极限压力处理能力、一定的处理能力、并发请求 ⑩ 伪造tooken等 7. 事务隔离级别 事务具有原子性Atomicity、一致性Consistency、隔离性Isolation、持久性Durability四个特性。 1. 事务隔离级别要实际解决的问题 1脏读指的是读到了其他事务未提交的数据即最终不一定存在的事务 2可重复读可重复读指的是在一个事务内最开始读到的数据和事务结束前的任意时刻读到的同一批数据都是一致的。通常针对数据更新UPDATE操作 3不可重复读对比可重复读不可重复读指的是在同一事务内不同的时刻读到的同一批数据可能是不一样的可能会受到其他事务的影响比如其他事务改了这批数据并提交了。通常针对数据更新UPDATE操作。 4幻读幻读是针对数据插入INSERT操作来说的。假设事务A对某些行的内容作了更改但是还未提交此时事务B插入了与事务A更改前的记录相同的记录行并且在事务A提交之前先提交了而这时在事务A中查询会发现好像刚刚的更改对于某些数据未起作用但其实是事务B刚插入进来的让用户感觉很魔幻感觉出现了幻觉这就叫幻读。 2. 事务隔离级别 1.SQL 标准定义了四种隔离级别MySQL 全都支持。这四种隔离级别分别是 读未提交READ UNCOMMITTED 读提交 READ COMMITTED 可重复读 REPEATABLE READ 串行化 SERIALIZABLE 从上往下隔离强度逐渐增强性能逐渐变差。采用哪种隔离级别要根据系统需求权衡决定其中可重复读是 MySQL 的默认级别。 2修改隔离级别的语句是set [作用域] transaction isolation level [事务隔离级别] 举个栗子下面这个语句的意思是设置全局隔离级别为读提交级别。 mysql set global transaction isolation level read committed; 3具体可以参考MySQL事务隔离级别和实现原因 8. 三次握手四次挥手 参考TCP三次握手四次挥手 1. 三次握手 注意:我们上面写的ack和ACK不是同一个概念 小写的ack代表的是头部的确认号Acknowledge number 缩写ack是对上一个包的序号进行确认的号ackseq1。大写的ACK则是我们上面说的TCP首部的标志位用于标志的TCP包是否对上一个包进行了确认操作如果确认了则把ACK标志位设置成1 2. 四次挥手 在第四次挥手时Client端向Server端发送标志位是ACK的报文段然后Client端进入TIME_WAIT状态。此时Client端等待2MSL的时间后依然没有收到回复则证明Server端已正常关闭那好Client端也可以关闭连接了。 3. 为何三次握手四次挥手 1建立连接时因为当Server端收到Client端的SYN连接请求报文后可以直接发送SYNACK报文。其中ACK报文是用来应答的SYN报文是用来同步的。所以建立连接只需要三次握手。 2由于TCP协议是一种面向连接的、可靠的、基于字节流的运输层通信协议TCP是全双工模式。这就意味着关闭连接时当Client端发出FIN报文段时只是表示Client端告诉Server端数据已经发送完毕了。当Server端收到FIN报文并返回ACK报文段表示它已经知道Client端没有数据发送了但是Server端还是可以发送数据到Client端的所以Server很可能并不会立即关闭SOCKET直到Server端把数据也发送完毕。当Server端也发送了FIN报文段时这个时候就表示Server端也没有数据要发送了就会告诉Client端我也没有数据要发送了之后彼此就会愉快的中断这次TCP连接。 4. 四次挥手时Client端为何要等待2MSL时间 MSL报文段最大生存时间它是任何报文段被丢弃前在网络内的最长时间。 1保证TCP协议的全双工连接能够可靠关闭 由于IP协议的不可靠性或者是其它网络原因导致了Server端没有收到Client端的ACK报文那么Server端就会在超时之后重新发送FIN如果此时Client端的连接已经关闭处于CLOESD状态那么重发的FIN就找不到对应的连接了从而导致连接错乱所以Client端发送完最后的ACK不能直接进入CLOSED状态而要保持TIME_WAIT当再次收到FIN的收能够保证对方收到ACK最后正确关闭连接。 2保证这次连接的重复数据段从网络中消失 如果Client端发送最后的ACK直接进入CLOSED状态然后又再向Server端发起一个新连接这时不能保证新连接的与刚关闭的连接的端口号是不同的也就是新连接和老连接的端口号可能一样了那么就可能出现问题如果前一次的连接某些数据滞留在网络中这些延迟数据在建立新连接后到达Client端由于新老连接的端口号和IP都一样TCP协议就认为延迟数据是属于新连接的新连接就会接收到脏数据这样就会导致数据包混乱。所以TCP连接需要在TIME_WAIT状态等待2倍MSL才能保证本次连接的所有数据在网络中消失。 9. 进程通信方式 参考进程通信和线程通信 进程通信 1管道pipe管道是一种半双工的通信方式数据只能单向流动而且只能在具有亲缘关系的进程间使用。进程的亲缘关系通常是指父子进程关系。 2有名管道namedpipe有名管道也是半双工的通信方式但是它允许无亲缘关系进程间的通信。 3信号量semophore信号量是一个计数器可以用来控制多个进程对共享资源的访问。它常作为一种锁机制防止某进程正在访问共享资源时其他进程也访问该资源。因此主要作为进程间以及同一进程内不同线程之间的同步手段。 4消息队列messagequeue消息队列是由消息的链表存放在内核中并由消息队列标识符标识。消息队列克服了信号传递信息少、管道只能承载无格式字节流以及缓冲区大小受限等缺点。 5信号signal信号是一种比较复杂的通信方式用于通知接收进程某个事件已经发生。 6共享内存shared memeory共享内存就是映射一段能被其他进程所访问的内存这段共享内存由一个进程创建但多个进程都可以访问。共享内存是最快的 IPC 其实交“网络摄像机”是IP Camera的简称方式它是针对其他进程间通信方式运行效率低而专门设计的。它往往与其他通信机制如信号量配合使用来实现进程间的同步和通信。 7套接字socket套接口也是一种进程间通信机制与其他通信机制不同的是它可用于不同设备及其间的进程通信。 线程通信 1锁机制包括互斥锁、条件变量、读写锁 -互斥锁提供了以排他方式防止数据结构被并发修改的方法。 -读写锁允许多个线程同时读共享数据而对写操作是互斥的。 -条件变量可以以原子的方式阻塞进程直到某个特定条件为真为止。对条件的测试是在互斥锁的保护下进行的。条件变量始终与互斥锁一起使用。 2信号量机制(Semaphore)包括无名线程信号量和命名线程信号量 3信号机制(Signal)类似进程间的信号处理 线程间的通信目的主要是用于线程同步所以线程没有像进程通信中的用于数据交换的通信机制。 10. 数组和链表 数组 1在内存中数组是一块连续的区间 2数组需要预留空间在编译阶段就需要确定数组的空间在运行阶段不允许更改对空间的利用率较低会存在浪费空间的现象 3在数组的起始位置插入和删除元素的效率较低 4随机访问效率较高时间复杂度可以达到O(1) 【优点】 5数组的空间在不够用时需要进行扩容扩容时需要将旧数组中所有元素向新数组中搬移浪费资源 6数组的空间是从栈分配的 链表 1在内存中元素的空间是分散的不需要连续的空间 2链表中的元素都会有两个属性一个是元素的值一个是指针地址用于找到下一个元素的位置 3查找数据效率较低时间复杂度为O(N)需要遍历查找 4空间不需要提前申请是动态申请的空间利用率高 5任意位置插入元素和删除元素效率较高时间复杂度为O(1) 5链表的空间是从堆中分配的 优缺点 1数组 优点随机访问效率高 缺点① 头插/头删效率低时间复杂度为O(N) ② 空间利用率不高 ③ 对内存空间要求高必须又足够的连续内存空间 ④ 数组大小固定不能动态扩展 2链表 优点① 任意位置插入和删除元素效率高时间复杂度为O(1) ② 内存利用率高不会浪费内存 ③ 空间大小不是固定的可以动态扩展 缺点随机访问效率低时间复杂度为O(N) 小结 对于想要快速访问而不经常进行插入删除元素就选择数组 对于需要经常插入删除元素对随机访问的效率要求不是很高时选择链表 11. java多线程实现方式未弄完 多线程的形式上实现方式主要有两种一种是继承Thread类一种是实现Runnable接口。本质上实现方式都是来实现线程任务然后启动线程执行线程任务这里的线程任务实际上就是run方法。 1继承Thread类重写run方法调用strat才可以启动线程 package com.kingh.thread.create;/*** 继承Thread类的方式创建线程** author a hrefhttps://blog.csdn.net/king_kghKingh/a* version 1.0* date 2019/3/13 19:19*/ public class CreateThreadDemo1 extends Thread {public CreateThreadDemo1() {// 设置当前线程的名字this.setName(MyThread);}Overridepublic void run() {// 每隔1s中输出一次当前线程的名字while (true) {// 输出线程的名字与主线程名称相区分printThreadInfo();try {// 线程休眠一秒Thread.sleep(1000);} catch (Exception e) {throw new RuntimeException(e);}}}public static void main(String[] args) throws Exception {// 注意这里要调用start方法才能启动线程不能调用run方法new CreateThreadDemo1().start();// 演示主线程继续向下执行while (true) {printThreadInfo();Thread.sleep(1000);}}/*** 输出当前线程的信息*/private static void printThreadInfo() {System.out.println(当前运行的线程名为 Thread.currentThread().getName());} } 2实现Runnable接口重写run 3 使用匿名内部类实现创建Thread子类的方式new Thread(){ … run(){}}.start(); 4 使用匿名内部类实现 实现Runnable接口的方式 5 使用Lambda表达式lambda本质上是一个“匿名函数” 其实lambda表达式一般用于一个方法的实现上该方法可以作为参数传入 6 使用线程池 7 使用Callable中间类FutureTask进行辅助是获取结果的凭证 可参考多线程创建方式 12. 线程的run()和start()有什么区别 注意在启动线程的时候并不是调用线程类的run方法而是调用了线程类的start方法。那么我们能不能调用run方法呢 答案是肯定的因为run方法是一个public声明的方法因此我们是可以调用的但是如果我们调用了run方法那么这个方法将会作为一个普通的方法被调用并不会开启线程。这里实际上是采用了设计模式中的模板方法模式Thread类作为模板而run方法是在变化的因此放到子类来实现。 1run()方法 run() 方法是线程的主体它是线程需要执行的方法线程启动后会自动执行 run() 方法中的代码。run() 方法通常包含线程的执行逻辑可以通过重写 run() 方法来实现自定义逻辑。 2start()方法 start() 方法是线程的启动方法它是一个系统级别的方法用于启动一个新线程。start() 方法会使 JVM 开辟一个新的线程并在新的线程中运行当前线程对象的 run() 方法而不是 run() 方法在当前线程中直接执行。也就是说调用 start() 方法后线程的状态变为可运行状态JVM 会自动创建一个新线程并在新线程中执行 run() 方法直到 run() 执行结束或者调用了 stop() 方法。 3小结 run() 方法是用户自定义的业务方法直接调用 run() 仅仅是方法的调用而 start() 方法是启动新线程的方法内部会自动调用 run() 方法来执行线程的任务。 13. 索引的概念、类型、优劣和使用注意 概念 索引是为了加速对表中数据行的检索而创建的一种分散的存储结构实现原理B树 。通俗点说类似于一本书的目录通过目录可以快速查到你想要的数据。优缺点 1优点 加快索引速度大大减少查询时间加索引比普通查询快很多 2缺点① 索引的创建和维护需要时间随着数量增减需要的时间也会增加 ② 索引是需要占用物理空间的也就是常说的用空间换时间表空间是有最大上限设置的如果一个表有大量索引会更快的到达上限值使用注意 ① 索引用在where条件经常使用的列 ② 加索引列的内容不要频繁变化 ③ 加索引列的内容不是唯一的几个值 ④ 加索引列的值可以为null并且可以存在多个null但是不能有重复的空字符串“” ⑤ 对于创建多个列索引如果不是一起使用的话查询时索引不会起作用 ⑥ 模糊查询时like前面以%开头索引会失效 ⑦ 如果该列类型是字符串则作为条件查询时该列的值一定要用’ 引起来否则索引失效 ⑧ 如果条件中带or那么条件中带索引会失效类型 1普通索引 普通索引由关键字KEY或INDEX定义的索引的唯一任务是加快对数据的访问速度。 CREATE INDEX index_name ON table(column)2唯一索引 索引列的值必须唯一但允许有空值。如果是组合索引则列值的组合必须唯一。 CREATE UNIQUE INDEX indexName ON table(column)3主键索引 主键索引是一种特殊的唯一索引一个表只能有一个主键不允许有空值。一般是在建表的时候同时创建主键索引。 CREATE TABLE table (id int(11) NOT NULL AUTO_INCREMENT , PRIMARY KEY (id) );4组合索引复合索引 用户可以在多个列上建立索引,这种索引叫做复合索引(组合索引) 。查询时使用创建时第一个开始索引才有效使用遵循左前缀集合。 ALTER TABLE tableName ADD INDEX indexName (name,xb,age); 14. 数据库查询的左外连接、分组、排序、删除、修改、更新 左外连接LEFT JOIN或LEFT OUTER JOIN 左向外联接的结果集包括 LEFT OUTER子句中指定的左表的所有行而不仅仅是联接列所匹配的行。如果左表的某行在右表中没有匹配行则在相关联的结果集行中右表的所有选择列表列均为空值。 右外连接right join 其实左外连接和右外连接就相当于是给字段匹配的行做笛卡尔积不匹配的就保持原有行另外的为null select a.*,b.* from a left join b on a.idb.parent_id内连接inner join 和完全连接full join ① 内连接inner join只输出匹配相等的值 ② 完全连接full join匹配成功的行以及左边表和右边表中未匹配成功的行没有置null 分组group by select column_name from table_name group by column_name having conditions;在 group by子句之后处理having 子句所以不能通过使用列别名来引用选择列表中指定的聚合函数。也就是说group by之后select出满足的再进行having筛选出select。 排序order by select 表字段 from 表名 order by 表字段 desc默认是升序asc 删除 delete from table_name where conditions; truncate table table_name; drop table table_name; ① delete属于DML数据操纵语言drop和truncate属于DDL数据定义语言 ② 执行效率droptruncatedelete ③ delete删除的数据可以恢复另外俩不可以 ④ 补充 DQL数据查询语言由select… from…where…组成的语句 DML数据操作语言如insert、update、delete DDL数据定义语言如create、drop、truncate隐式操作不能回滚 DCL数据控制语言如GRANT授权ROLLBACK [WORK] TO [SAVEPOINT]回滚COMMIT [WORK]提交 修改alter alter table table_name add/modify column_name ...参考alter的使用 更新update UPDATE student SET age18,name李 WHERE name赵 or age1615. delete、drop和truncate的区别 相同点都可以删除整张表中的数据不同点 1删除范围drop删除表中所有数据及表结构truncate删除表中所有数据delete删除表中所有数据或部分数据 2查询条件delete可以使用查询条件where进行表中数据删除drop和truncate不可以 3命令类型delete属于DMLdrop和truncate属于DDL 4是否可恢复delete删除的数据可以恢复/回滚但是drop和truncate删除的数据不能恢复隐式提交不会触发触发器 5执行效率droptruncatedelete 6删除方式delete一行一行删除并且由操作日志 7空间释放DELETE操作不会减少表或索引所占用的空间当表被TRUNCATE 后这个表和索引所占用的空间会恢复到初始大小。 8操作对象DELETE可以是table和view其余只能是table 参考drop、delete和truncate的区别 16. 四种常用修饰符 public protected default private 17. Linux常用命令并解释未弄完 1)more适用于查看内容较多的文本文件 2echo终端输出和重定向 echo hello world a.txt1ls -l 文件 功能描述列表的内容写入文件 a.txt 中覆盖写 2ls -al 文件 功能描述列表的内容追加到文件 aa.txt 的末尾 3cat 文件 1 文件 2 功能描述将文件 1 的内容覆盖到文件 2 4echo “内容” 文件覆盖写 末尾追加 3磁盘查看df 4查找文件find path -name ‘file.txt’ 18. OSI七层模型每层的作用是什么 参考OSI七层模型及其作用 OSI七层模型 TCP/IP四层协议 tcpip协议规定为4层分别是含应用层、传输层、网络层、网络接口层4层。 TCP/UDP协议 1TCP (Transmission Control Protocol)和UDP(User Datagram Protocol)协议属于传输层协议。 2其中TCP提供IP环境下的数据可靠传输它提供的服务包括数据流传送、可靠性、有效流控、全双工操作和多路复用。通过面向连接、端到端和可靠的数据包发送。通俗说它是事先为所发送的数据开辟出连接好的通道然后再进行数据发送;而UDP则不为IP提供可靠性、 流控或差错恢复功能。 3一般来说TCP对应的是可靠性要求高的应用而UDP对应的则是可靠性要求低、传输经济的应用。 4TCP支持的应用协议主要 有Telnet、FTP、SMTP等;UDP支持的应用层协议主要有NFS(网络文件系统)、SNMP(简单网络管理协议)、DNS(主域名称系统)、TFTP(通用文件传输协议)等. 5TCP/IP协议与低层的数据链路层和物理层无关这也是TCP/IP的重要特点 OSI七层参考模型的各个层次的划分遵循下列原则 1同一层中的各网络节点都有相同的层次结构具有同样的功能。 2同一节点内相邻层之间通过接口(可以是逻辑接口)进行通信。 3七层结构中的每一层使用下一层提供的服务并且向其上层提供服务。 4不同节点的同等层按照协议实现对等层之间的通信。 19. 左连接和右连接的区别 1意思不一样左连接只要左表有数据就可以检索到影响的是右表 2空值不一样左连接中若左表条件数据在右表中没有此时输出结果右表中数据置null 20. 微信朋友圈点赞如何设计测试用例 1界面图片、文字、排版、时间、版本的适应 2功能点赞人、被点赞人、消息提醒、内容类型、点赞人数、点赞展示是否按时间排序 3性能并发、压力 4兼容性系统、微信版本、手机型号、手机低配、加载速度 5弱网 6安全性其他人能否看到非共同好友点赞屏蔽删除能否点赞 7安装/卸载/换设备 8未加好友能否点赞 9易用性 10容错性关机、内存不够、断网等 21. 动态规划描述 参考动态规划详解 概念 通过把原问题分解为相对简单的子问题的方式求解复杂问题的方法。动态规划常常适用于有重叠子问题和最优子结构性质的问题。核心思想 动态规划最核心的思想就在于拆分子问题记住过往减少重复计算解题特征 如果一个问题可以把所有可能的答案穷举出来并且穷举出来后发现存在重叠子问题就可以考虑使用动态规划。 比如一些求最值的场景如最长递增子序列、最小编辑距离、背包问题、凑零钱问题等等都是动态规划的经典应用场景。 解题思路 ① 穷举分析 ② 确定边界 ③ 找出规律确定最优子结构 ④ 写出状态转移方程经典题型 动态规划有几个典型特征最优子结构、状态转移方程、边界、重叠子问题。 在青蛙跳阶问题中 f(n-1)和f(n-2) 称为 f(n) 的最优子结构 f(n) fn-1fn-2就称为状态转移方程 f(1) 1, f(2) 2 就是边界啦 比如f(10) f(9)f(8),f(9) f(8) f(7) ,f(8)就是重叠子问题 public class Solution {public int numWays(int n) {if (n 1) {return 1;}if (n 2) {return 2;}int a 1;int b 2;int temp ;for (int i 3; i n; i) {temp (a b)% 1000000007;a b;b temp;}return temp;}} 22. 字符串S和T返回S中包含T中所有字符的连续字串 思路判断长度比较hashMap使用使用滑动窗口双指针 left和right从左边开始right开始移动比较当前字符是否出现在t中若t中所有字符串均出现此时就是一个满足条件的字符串可以使用subString进行输出然后left看目前left到right的部分是否包含t中所有字符包含则输出然后left若不包含则right。可以使用HashMap进行存储判断是否存在以数量进行判断 参考最小覆盖字串 getOrDefault()的使用 ① getOrDefault() 方法获取指定 key 对应对 value如果找不到 key 则返回设置的默认值。 ② getOrDefault() 方法的语法为 hashmap.getOrDefault(Object key, V defaultValue)23. 判断一棵树是平衡二叉树 所谓的平衡二叉树是指以当前结点为根结点的树左右子树的高度差不得超过1。 注意空树也是平衡二叉树。 思路 平衡root左子树高度-root右子树高度1 root左右子树都平衡递归实现 判断空树代码 1时间复杂度O(N2) // 二叉树的最大深度public int maxDepth(TreeNode root) {// 其实就相当于层序遍历并记录注意递归不在三目运算符中// 如何判断一层遍历结束if(rootnull) {return 0;}// 返回是要判断左子树深还是右子树深int leftTree maxDepth(root.left);int rightTree maxDepth(root.right);return (leftTreerightTree? (leftTree1):(rightTree1));}// 判断平衡二叉树public boolean isBalanced(TreeNode root) {if(rootnull) {return true;}// 返回是要判断左子树深还是右子树深int leftTree maxDepth(root.left);int rightTree maxDepth(root.right);// 为什么绝对值要小于等于1平衡树的定义--每个结点的左右子树子结点高度相差1// 平衡每个结点的左右子树相差不超过1 左右子树均平衡return ((Math.abs(leftTree-rightTree)1) (isBalanced(root.left)) (isBalanced(root.right)));} ② 优化版时间复杂度O(N) // 但是上面的方法时间复杂度O(N^2)// 改进边遍历边判断是否平衡降低时间复杂度为O(n)public int maxDepth2(TreeNode root) {if (rootnull) {return 0;}int leftTree maxDepth2(root.left);int rightTree maxDepth2(root.right);if(leftTree0 rightTree0 (Math.abs(leftTree-rightTree)1)) {return (Math.max(leftTree,rightTree)1);} else {return -1;}}public boolean isBalanced2(TreeNode root) {return maxDepth2(root)0;} 二叉树相关练习题参考二叉树练习题 24. 线程和进程的区别 1进程包含线程 2线程比进程更轻量创建更快、销毁也更快 3 同一个进程的多个线程之间共用一份内存和文件资源而进程和进程之间则是独立的文件和内存资源线程共用资源就省去了线程分配资源的过程 4 进程是资源分配的基本单位线程是调度执行的基本单位 25. 线程池是什么 具体参考线程池详解 概念 线程池是一种利用池化技术思想来实现的线程管理技术主要是为了复用线程、便利地管理线程和任务、并将线程的创建和任务的执行解耦开来。我们可以创建线程池来复用已经创建的线程来降低频繁创建和销毁线程所带来的资源消耗。在JAVA中主要是使用ThreadPoolExecutor类来创建线程池并且JDK中也提供了Executors工厂类来创建线程池不推荐使用。 优点 ① 降低资源消耗复用已创建的线程来降低创建和销毁线程的消耗。 ② 提高响应速度任务到达时可以不需要等待线程的创建立即执行。 ③ 提高线程的可管理性使用线程池能够统一的分配、调优和监控。 ThreadPoolExecutor类的构造方法 public ThreadPoolExecutor(int corePoolSize,int maximumPoolSize,long keepAliveTime,TimeUnit unit,BlockingQueueRunnable workQueue,ThreadFactory threadFactory,RejectedExecutionHandler handler) ① corePoolSize核心线程数量决定是否创建新的线程来处理到来的任务 ② maximumPoolSize最大线程数量线程池中允许创建线程地最大数量 ③ keepAliveTime线程空闲时存活的时间 ④ unit空闲存活时间单位 ⑤ workQueue任务队列用于存放已提交的任务 ⑥ threadFactory线程工厂用于创建线程执行任务 ⑦ handler拒绝策略当线程池处于饱和时使用某种策略来拒绝任务提交 handler拒绝策略 ① AbortPolicy中断策略直接抛异常 handler回调处理方法 ② CallerRunsPolicy调用者来执行而不是被调用者来执行按理来说是被调用者执行如果调用者也不执行就丢弃该任务 ③ DiscardOldestPolicy丢弃最老的未处理请求 ④ DiscardPolicy直接丢弃最新的任务 实际开发中需要根据请求来决定使用哪种策略 线程池五种状态 26. get和post的区别 http请求方法get和post是最常被用到的两个方法get常用于向服务器请求数据post常用于提交数据给服务器处理。 GET方法其实也可以传递少量的数据。 但它存在以下问题 GET 方法不包含body因此以在URL中拼接字段的方式传递数据 2GET方法中的URL参数会被显示到地址栏上存在安全问题 3GET传递的数据只能是键值对无法传递其他类型的数据 因此出于传递大量、多种类型的数据和安全性的考虑上传数据常使用post方法 ① GET请求参数放在url中不同浏览器和服务器会对长度进行不同的限制post请求无限制 ② get请求刷新服务器或者回退没有影响post请求回退时会重新提交数据请求 ③ get请求可以被缓存post请求不会被缓存 ④ get请求会被保存在浏览器历史记录当中post不会。get请求可以被收藏为书签因为参数就在url中但post不能它的参数不在url中。 ⑤ get请求只能进行url编码appliacation-x-www-form-urlencoded,post请求支持多种multipart/form-data等 参考get和post区别 27. 从输入一个网址到展示页面经历了哪些过程用了哪些通信协议 1DNS域名解析本地hosts文件、 浏览器缓存、 本地域名解析服务器-根域名服务器 -顶级域名服务器 - 二级域名服务器 - 将域名解析为IP地址。通信协议DNS协议 2三次握手建立连接通信协议TCP 3发送HTTP请求客户端给服务器发送HTTP请求携带请求内容。通信协议HTTP 4服务器处理请求服务器想文件系统等中检索需求所需内容 5将处理结果返回给客户端通过之前建立好的TCP进行返回 6浏览器接收响应并看情况关闭TCPTCP四次挥手 7解析详细并进行渲染最终在页面上显示 参考url到页面渲染 28. 白盒测试需要遵循的原则 1保证一个模块中的所有独立路径至少被测试一次。 2对所有的逻辑判定均需测试取真和取假两种情况。 3在上下边界及可操作范围内运行所有循环。 4检查程序的内部数据结构保证其结构的有效性。 29. 深拷贝和浅拷贝 Ps.基本数据类型储存在栈中而引用数据类型在栈中存储的是引用地址实际的值存储在堆中 深拷贝Deep Copy和浅拷贝Shallow Copy是在进行对象拷贝时常用的两种方式它们之间的主要区别在于是否复制了对象内部的数据。 1浅拷贝只复制了对象本身不会复制对象内部的数据。 2深拷贝递归地复制了对象及其所有子对象的内容。 3 引用拷贝是将一个对象的引用赋值给另一个变量使得两个变量指向同一个对象。浅拷贝修改原来对象的值会同步改变深拷贝各自独立。 30. TCP和UDP的区别 1连接 TCP是面向连接的传输层协议传输数据前需要先建立连接UDP不需要建立连接即时通信 2服务对象 TCP 是一对一的两点服务即一条连接只有两个端点。 UDP 支持一对一、一对多、多对多的交互通信。 3可靠性 TCP 是可靠交付数据的数据可以无差错、不丢失、不重复、按需到达。 UDP 是尽最大努力交付不保证可靠交付数据。 4拥塞控制、流量控制 TCP 有拥塞控制和流量控制机制保证数据传输的安全性。 UDP 则没有即使网络非常拥堵了也不会影响 UDP 的发送速率。 5首部开销 TCP 首部长度较长会有一定的开销首部在没有使用「选项」字段时是 20 个字节如果使用了「选项」字段则会变长的。 UDP 首部只有 8 个字节并且是固定不变的开销较小 6传输方式 TCP 是流式传输没有边界但保证顺序和可靠。 UDP 是一个包一个包的发送是有边界的但可能会丢包和乱序。 7分片不同 TCP 的数据大小如果大于 MSS 大小除去 IP 和 TCP 头部之后一个网络包所能容纳的 TCP 数据的最大长度则会在传输层进行分片目标主机收到后也同样在传输层组装 TCP 数据包如果中途丢失了一个分片只需要传输丢失的这个分片。 UDP 的数据大小如果大于 MTU 大小最大传输单元是可以在网络中传输的最大数据包大小则会在 IP 层进行分片目标主机收到后在 IP 层组装完数据接着再传给传输层 31. 锁未弄完 https://www.cnblogs.com/lifegoeson/p/13683785.html 32. 自动化测试中selenium等待的类型 通过在脚本中设置等待的方式来避免由于网络延迟或浏览器卡顿导致的元素找不到的偶然失败问题常用的三种等待 1强制等待 ① 利用time模块的sleep方法来实现最简单粗暴的等待方法 ② 弊端严重影响代码的执行速度 # 强制等待3秒 time.sleep(3)2隐式等待 ① implicitly_wait()方法用来等待页面加载完成直观的就是浏览器tab页上的小圈圈转完网页加载完成则执行下一步 ② 隐式等待只需要声明一次一般在打开浏览器后进行声明 ③ 声明之后对整个drvier的生命周期都有效后面不用重复声明 ④ 弊端程序会一直等待页面加载完成直到超时。有时我们需要的元素已经加载完成但是依旧需要等待页面上所有的元素都加载完成才能下一步 # 隐性等待5秒 driver.implicitly_wait(5)3显示等待 ① WebDriverWait配合该类的until()和until_not()方法就能够根据判断条件而进行灵活地等待了 ② 它主要的意思就是程序每隔xx秒看一眼如果条件成立了则执行下一步否则继续等待直到超过设置的最长时间然后抛出TimeoutException ③ 显示等待必须在每个需要等待的元素前面进行声明 33. 数据库常用语句未弄完 34. app与web测试的区别 参考web与app端测试 Ps. APP需要关注安装/卸载/更新、中断如关机、电话、短信等、专项测试如网络适配性、运营商环境、WIFI、交互鼠标、点击/手势/横屏等、升级测试原有功能、用户数据等 1系统架构方面 web项目b/s架构基于浏览器的web测试只要更新了服务器端客户端就会同步会更新 app项目c/s结构的必须要有客户端app 修改了服务端则客户端用户所有核心版本都需要进行回归测试一遍 2性能方面 web项目 需监测 响应时间、CPU、Memory、点击率、TPS、并发等 app项目 除了监测 响应时间、CPU、Memory外还需监测流量、电量等 3兼容方面 ① web项目 浏览器火狐、谷歌、IE等 操作系统Windows7、Windows10、OSX、Linux等 ② app项目 设备系统: iOSipad、iphone、Android三星、华为、联想等 、WindowsWin7、Win8、OSXMac 手机设备可根据 手机型号、分辨率不同 4相对于web项目app华友专项测试 ① 干扰测试中断来电短信关机重启等 ② 弱网络测试模拟2g、3g、4gwifi网络状态以及丢包情况网络切换测试网络断开后重连、3g切换到4g/wifi 等 ③ 安装、更新、卸载 安装需考虑安装时的中断、弱网、安装后删除安装文件等情况 卸载需考虑 卸载后是否删除app相关的文件 更新分强制更新、非强制更新、增量包更新、断点续传、弱网状态下更新 5测试工具 自动化工具APP 一般使用 Appium; Web 一般使用 Selenium 性能测试工具APP 一般使用 JMeter; Web 一般使用 LR、JMeter 6界面操作关于手机端测试需注意手势横竖屏切换多点触控前后台切换 7安全测试安装包是否可反编译代码、安装包是否签名、权限设置例如访问通讯录等 8 边界测试可用存储空间少、没有SD卡/双SD卡、飞行模式、系统时间有误、第三方依赖QQ、微信登录等 9权限测试设置某个App是否可以获取该权限例如是否可访问通讯录、相册、照相机等 10升级测试升级后原有功能是否受影响用户数据是否丢失 35. wait和sleep的区别 参考wait和sleep区别 1使用限制 ① 使用 sleep 方法可以让让当前线程休眠时间一到当前线程继续往下执行在任何地方都能使用但需要捕获 InterruptedException 异常。 Thread.sleep(3000L);② 而使用 wait 方法则必须放在 synchronized 块里面同样需要捕获 InterruptedException 异常并且需要获取对象的锁。 synchronized (lock){try {lock.wait();} catch (InterruptedException e) {e.printStackTrace();} }而且 wait 还需要额外的方法 notify/ notifyAll 进行唤醒它们同样需要放在 synchronized 块里面且获取对象的锁。 2使用场景 sleep 一般用于当前线程休眠或者轮循暂停操作wait 则多用于多线程之间的通信 3所属类不同 sleep 是 Thread 类的静态本地方法wait 则是 Object 类的本地方法 4释放锁 wait 可以释放当前线程对 lock 对象锁的持有而 sleep 则不会。 5线程切换 sleep 会让出 CPU 执行时间且强制上下文切换而 wait 则不一定wait 后可能还是有机会重新竞争到锁继续执行的。 36. 如何保证线程安全 参考线程安全 Java并发的三大基本特性原子性、可见性以及有序性 解决办法使用多线程之间使用关键字synchronized、或者使用锁lock或者volatile关键字。 ① synchronized自动锁锁的释放是在synchronized同步代码执行完毕后自动释放。 弊端多个线程需要判断锁较为消耗资源、抢锁的资源。 ② Lock锁是需要手动去加锁和释放锁Lock相比于synchronized更加的灵活。tryLock()方法会尝试获取锁如果锁不可用则返回false如果锁是可以使用的那么就直接获取锁且返回true。主动通过unLock()去释放锁。竞争激烈使用Lock ③ Volatile 关键字的作用是变量在多个线程之间可见。使用Volatile关键字将解决线程之间可见性强制线程每次读取该值的时候都去“主内存”中取值。 volatile虽然具备可见性但是不具备原子性。 37. 常见中间件 中间件概念 ① 中间件英语Middleware顾名思义是系统软件和用户应用软件之间连接的软件以便于软件各部件之间的沟通 ② 总的作用是为处于自己上层的应用软件提供运行与开发的环境帮助用户灵活、高效地开发和集成复杂的应用软件。 了解补充 中间件与操作系统和数据库共同构成基础软件三大支柱是一种应用于分布式系统的基础软件位于应用与操作系统、数据库之间为上层应用软件提供开发、运行和集成的平台。中间件解决了异构网络环境下软件互联和互操作等共性问题并提供标准接口、协议为应用软件间共享资源提供了可复用的“标准件”。 常见中间件 Tomcat Weblogic Jboss Jetty Webshere Glassfish 38. 线程状态 参考线程状态 线程六种状态 ① 初始(NEW)新创建了一个线程对象但还没有调用start()方法。 ② 运行(RUNNABLE)Java线程中将就绪ready和运行中running两种状态笼统的称为“运行”。 线程对象创建后其他线程(比如main线程调用了该对象的start()方法。该状态的线程位于可运行线程池中等待被线程调度选中获取CPU的使用权此时处于就绪状态ready。就绪状态的线程在获得CPU时间片后变为运行中状态running。 ③ 阻塞(BLOCKED)表示线程阻塞于锁。 ④ 等待(WAITING)进入该状态的线程需要等待其他线程做出一些特定动作通知或中断。 ⑤ 超时等待(TIMED_WAITING)该状态不同于WAITING它可以在指定的时间后自行返回。 ⑥ 终止(TERMINATED)表示该线程已经执行完毕。 39. 死锁产生的条件 循环等待、不可抢占、互斥、请求和保持 40. Bean的生命周期 41. 缺陷的生命周期 参考缺陷介绍 1发现缺陷 2提交缺陷 3确认缺陷 4分配缺陷 5修复缺陷 6验证缺陷 7关闭缺陷 42. awk使用 介绍 awk 是一种编程语言用于在linux/unix下对文本和数据进行处理。具体使用参考Linux awk命令 Linux命令使用手册 43. 最长回文子串!!!未完成 中心扩散法 1思路 时间复杂度O(n2) ① 遍历每个字符 ② 以每次遍历到的字符为中心分奇数长度和偶数长度两种情况不断向两边扩展 ③ 如果两边都是相同的就是回文不断扩大到最大长度即是以这个字符或偶数两个为中心的最长回文子串 ④ 遍历完成后取最大值 2代码 import java.util.*;public class Solution {/*** 代码中的类名、方法名、参数名已经指定请勿修改直接返回方法规定的值即可** * param A string字符串 * return int整型*/public int getLongestPalindrome (String A) {// write code here// 存储最长字符串String maxStr ;// 存储最大长度int maxLen 1;// 每个点都有机会作为中心点// 注意循环最多只能到倒数第二个因为会有1情况for(int i 0; i A.length() - 1; i) {// 分为奇数和偶数长度向两边扩展maxLen Math.max(maxLen,Math.max(fun(A,i,i), fun(A,i,i1)));// 注意如果需要最长字符串的话每次遍历的时候可以记住其实位置和终止位置然后截取字符串// 或者是每次遍历使用临时变量存储然后发现如果此循环结束后长度大于之前就进行更新}return maxLen;}// 中心点扩展private int fun(String s, int left, int right) {// 从遍历到的点作为起点向两边扩展一旦遇到不相等就停止计数while(left 0 right s.length() s.charAt(left) s.charAt(right)) {left--; // 左边扩展right; // 右边扩展}return right - left - 1;} }动态规划 1思路 时间/空间复杂度O(n2) ① 维护一个布尔型的二维数组dp[i][j]表示i到j的子串是否为回文子串 ② 从长度为2开始进行比较里面的start从0开始可以最大到len-2end最大到len-1 2代码 public int longestPalindrome (String s) {// 动归思想// 使用数组表示从i到j的字符串是否为回文串true表示是false表示不是// i到i只有一个字符标识为是回文串int len s.length();boolean[][] dp new boolean[len][len];int maxLen 1;for (int i 0; i len; i) {dp[i][i] true;}// 然后开始循环遍历// 最外层为长度遍历for (int length 2; length len; length) {// 标识开始位置和结束位置for (int start 0; start len -length; start) { // 只能到len -length要流出最后的位置是为了给end让路int end start length - 1;// 首先比较首尾字符 如果相等 继续向中间比较if(s.charAt(start) s.charAt(end)) {// 继续向中间比较// 这里注意条件等于2是为了长度为2时避免俩字符再比较一次dpif(length2 || dp[start1][end-1]) {// 那么更新最大长度// 为什么可以直接更新长度从小到大确保了都是回文串的maxLen Math.max(maxLen,length);// 更新dpdp[start][end] true;}}}}return maxLen;}暴力法 1思路 ① 进行双层循环遍历第一层是标识开始的位置从0开始到length-1的位置 ② 第二层从第一层标识开始位置往后遍历此时需要进行比较如果两间隔小于已有的maxLength此时就没有比较的必要而是直接continue第二层往后走如果间隔大于已有的maxLength则进行比较一旦在比较过程中出现不相等就停止直到左边右边 ③ 如果此时更新过maxLength需要记录当前的起始下标以及结束下标截取字符串拿到最长子串 2代码 import java.util.*;public class Solution {/*** 代码中的类名、方法名、参数名已经指定请勿修改直接返回方法规定的值即可** * param s string字符串 * return int整型*/public int longestPalindrome (String s) {// write code hereint len s.length();// 特殊判断if(len 1) {return len;}// 说明需要求最长回文串int maxLen 1;String maxStr ;// 双指针// 第一层循环for (int i 0; i len - 1; i) {// 第二层循环for (int j i; j len; j) {// 开始进行判断// 看两个字符间的间隔是否大于maxLen如果不大于其实就没有继续比较的必要了if(j - i 1 maxLen) {continue; // 直接第二层指针往后移} else if (comp(s,i,j)) {// 开始比较 并且是该子串是完全匹配上的// 并且经过以上的过滤之后此时的一定是更长的maxLen j - i 1;maxStr s.substring(i,j1);}}}System.out.println(max: maxStr);return maxLen;}private static boolean comp(String s, int i, int j) {while((i j) (s.charAt(i) s.charAt(j))) {i; // 左边往后j--; // 右边往前}// 出来两种情况if(i j) {// 说明是回文串return true;} else {return false;}} }44. 查看进程 参考Linux查看进程命令 ① ps -aux | grep java 是以简单列表的形式显示出进程信息通常用于查看进程的PID。静态 可以使用kill命令终止进程如kill -9 [PID]-9表示强迫进程立即停止 ② top命令可以实时显示各个线程情况。要在top输出中开启线程查看请调用top命令的“-H”选项该选项会列出所有Linux线程。在top运行时你也可以通过按“H”键将线程查看模式切换为开或关。 ③ pstree命令以树状图的方式展现进程之间的派生关系显示效果比较直观。 45. chmod的数字含义 参考chmod命令 chmod 755作用 Linux chmod英文全拼change mode命令是控制用户对文件的权限的命令 Linux/Unix 的文件调用权限分为三级 : 文件所有者Owner、用户组Group、其它用户Other Users。 chmod 后面的数字含义 ① 注每个级别下面的权限顺序读r、写w、执行x ② 语法chmod num file/directory 对特定级别进行权限限制 ① 语法chmod ugw o-x file ② 相关符号表示 46. Java面向对象的三大特征并进行解释 参考面向对象三大特征 卖你想对象三大特征含代码 对象 对象其实可以理解为就是一个实体实体是某个类的实例对象具有行为和属性对象具有唯一性对象具有可变性。面向过程最小单位是函数函数间相互调用面向对象最小单位是类强调的是具备某些功能的对象。面向对象三大特征封装、继承和多态。 1继承 ① 继承就是子类继承父类的特征和行为。 ② 子类拥有父类中的一切拥有不一定能使用它可以访问和使用父类中的非私有成员变量以及重写父类中的非私有成员方法。 ③ 继承的作用就是能提高代码的复用性。 ④ java中类的继承支持单继承 ⑤ 子类代码示例 public class Student extends Person {Overridepublic void say() {super.say();}Overridepublic void run() {super.run();}public static void main(String[] args) {Student stu new Student();//stu.a1;//子类对象对父类的私有成员变量使用报错//stu.show();//子类对象调用父类的私有方法同样报错stu.say();stu.run();} }2封装 ① 封装就是把类内部的实现细节隐藏起来只暴露对外的接口。 ② 封装又分为属性的封装和方法的封装。把属性定义为私有的它们通过setter和getter方法来对属性的值进行设定和获取。 ③ 代码示例 public class Person {private int id;private String name;private Person person;public int getId() {return id;}public String getName() {return name;}public Person getPerson() {return person;}public void setId(int id) {this.id id;}public void setName(String name) {this.name name;}public void setPerson(Person person) {this.person person;}Overridepublic String toString() {return Person [id id , name name , person person ];} }3多态 ① 多态就是指多种状态就是说当一个操作在不同的对象时会产生不同的结果。 ② 在Java中实现多态的方式有两种一种是编译时的多态另外一种是运行时多态。编译时的多态是通过方法的重载实现的而运行时多态是通过方法的重写实现的。 ③ 方法的重载是指在同一个类中有多个方法名相同的方法但是这些方法有着不同的参数列表在编译期我们就可以确定到底调用哪个方法。 ③ 方法的重写子类重写父类中的方法包括接口的实现父类的引用不仅可以指向父类的对象而且还可以指向子类的对象。当父类的引用指向子类的引用时只有在运行时才能确定调用哪个方法。 ④ 其实在运行时的多态的实现需要满足三个条件继承包括接口的实现、方法的重写 、父类的引用指向子类对象 ⑤ 运行时的多态 // 接口 public interface Animal {void shout(); }// 实现类 public class Dog implements Animal{Overridepublic void shout() {System.out.println(wangwang...);} }// 实现类public class Cat implements Animal {Overridepublic void shout() {System.out.println(miaomiao...);} }//测试 public class AnimalTest {public static void main(String[] args) {//父类的引用指向子类对象Animal d new Dog();animalShout(d);//父类的引用指向子类对象Animal c new Cat();animalShout(c); }public static void animalShout(Animal animal) {animal.shout();} }47. netstat的使用 netstat 是一款命令行工具可用于列出系统上所有的网络套接字连接情况包括 tcp, udp 以及 unix 套接字另外它还能列出处于监听状态即等待接入请求的套接字。如果你想确认系统上的 Web 服务有没有起来你可以查看80端口有没有打开。命令介绍 1列出所有当前的连接使用-a netstat -a 2只列出TCP或UDP协议的连接 ① TCP协议的连接-t netstat -at ② UDP协议的连接-u netstat -au 3禁用反向域名解析加快查询速度 默认情况下 netstat 会通过反向域名解析技术查找每个 IP 地址对应的主机名。这会降低查找速度。如果你觉得 IP 地址已经足够而没有必要知道主机名就使用 -n 选项禁用域名解析功能。 netstat -ant 4只列出监听中的连接 netstat -ntl 5获取进程名、进程号以及用户 ID sudo netstat -nlpt 6打印统计数据 netstat 可以打印出网络统计数据包括某个协议下的收发包数量。 netstat -s 7更多参考netstat的使用 netstat可以查询出TCP和UDP的状态如TCP的LISTENING、ESTABLISHED、SYN_SEND、FIN_WAIT_1、FIN_WAIT_2、TIME_WAIT、CLOSE_WAIT状态 48. ping的工作原理 ping 是基于 ICMP 协议工作的ICMP是网络层协议 ICMP 主要的功能包括确认 IP 包是否成功送达目标地址、报告发送过程中 IP 包被废弃的原因和改善网络设置等。 在 IP 通信中如果某个 IP 包因为某种原因未能达到目标地址那么这个具体的原因将由 ICMP 负责通知。ICMP的通知消息是使用IP进行发送的。 ARP地址解析协议工作在网络层用于将计算机的网络地址IP地址32位转化为物理地址MAC地址48位 回送消息用于进行通信的主机或路由器之间判断所发送的数据包是否已经成功到达对端的一种消息ping 命令就是利用这个消息实现的。 其他差错类型参考ping的工作原理 49. hashmap和hashset的区别 参考HashMap和HashSet的区别 1HashMap和HashSet都是collection框架的一部分它们让我们能够使用对象的集合。collection框架有自己的接口和实现主要分为Set接口List接口和Queue接口。它们有各自的特点Set的集合里不允许对象有重复的值List允许有重复它对集合中的对象进行索引Queue的工作原理是FCFS算法(First Come, First Serve)。 2HashSet HashSet实现了Set接口它不允许集合中有重复的值允许有null值当我们提到HashSet时第一件事情就是在将对象存储在HashSet之前要先确保对象重写equals()和hashCode()方法这样才能比较对象的值是否相等以确保set中没有储存相等的对象。如果我们没有重写这两个方法将会使用这个方法的默认实现。 public boolean add(Object o)方法用来在Set中添加元素当元素值重复时则会立即返回false如果成功添加的话会返回true。 3HashMap ① HashMap实现了Map接口Map接口对键值对进行映射。 ② Map中不允许重复的键。Map接口有两个基本的实现HashMap和TreeMap。 ③ TreeMap保存了对象的排列次序而HashMap则不能。 ④ HashMap允许键和值为null。 ⑤ HashMap是非synchronized的但collection框架提供方法能保证HashMap synchronized这样多个线程同时访问HashMap时能保证只有一个线程更改Map。 ⑥ public Object put(Object Key,Object value)方法用来将元素添加到map中。 4HashMap和HashSet的区别 50. treemap和hashmap的区别 参考treemap和hashmap的区别01 treemap和hashmap的区别02 1内部实现 ① HashMap是基于哈希表来实现的通过使用键的hashcode()和equals()来确定键值对的存储位置为了优化HashMap的空间使用可以调优初始容量和负载因子 ② TreeMap基于红黑树一种自平衡的搜索二叉树实现的它根据键的自然顺序或者Comparator来组织键值对TreeMap没有调优选项因为红黑树总是处于平衡的状态 2元素排序 ① HashMap中元素是没有特定排序的会随着键值对的添加和删除而变化HashMap是通过hashcode()对其内容进行快速查找的 ② TreeMap中的所有元素都是有某一固定的顺序的TreeMap会根据键的自然顺序或者Comparator来对元素进行排序 3线程安全 HashMap和TreeMap都不是线程安全的如果在多线程环境中使用需要使用者自行保证线程安全 4父类 ① HashMap继承自AbstractMap类覆盖了hashcode() 和equals() 方法以确保两个相等的映射返回相同的哈希值 ② TreeMap继承自SortedMap类保持键的有序顺序 5键值对的存储限制 ① HashMap允许使用null作为键和值 ② TreeMap不允许使用null作为键但允许使用null作为值 6性能 ① HashMap的插入、查找、删除操作的平均时间复杂度为O(1)对于需要频繁插入、查找、删除操作的场景HashMap通常会有更好的性能。 ② TreeMap的插入、删除、查找的平均时间复杂度为O(logn)适用于按自然顺序或自定义顺序遍历键key 51. 哪些是线程安全的 https://blog.csdn.net/LexAG/article/details/106886870#:~:textVector%EF%BC%9A%E5%8F%AA%E8%A6%81%E6%98%AF%E5%85%B3%E9%94%AE%E6%80%A7%E7%9A%84%E6%93%8D%E4%BD%9C%EF%BC%8C%E6%96%B9%E6%B3%95%E5%89%8D%E9%9D%A2%E9%83%BD%E5%8A%A0%E4%BA%86synchronized%E5%85%B3%E9%94%AE%E5%AD%97%EF%BC%8C%E6%9D%A5%E4%BF%9D%E8%AF%81%E7%BA%BF%E7%A8%8B%E7%9A%84%E5%AE%89%E5%85%A8%E6%80%A7%20Hashtable%EF%BC%9A%E4%BD%BF%E7%94%A8%E4%BA%86synchronized%E5%85%B3%E9%94%AE%E5%AD%97%EF%BC%8C%E6%89%80%E4%BB%A5%E7%9B%B8%E8%BE%83%E4%BA%8EHashmap%E6%98%AF%E7%BA%BF%E7%A8%8B%E5%AE%89%E5%85%A8%E7%9A%84%E3%80%82,ConcurrentHashMap%3A%E4%BD%BF%E7%94%A8%E9%94%81%E5%88%86%E6%AE%B5%E6%8A%80%E6%9C%AF%E7%A1%AE%E4%BF%9D%E7%BA%BF%E6%80%A7%E5%AE%89%E5%85%A8%EF%BC%8C%E6%98%AF%E4%B8%80%E7%A7%8D%E9%AB%98%E6%95%88%E4%BD%86%E6%98%AF%E7%BA%BF%E7%A8%8B%E5%AE%89%E5%85%A8%E7%9A%84%E9%9B%86%E5%90%88%E3%80%82%20Stack%EF%BC%9A%E6%A0%88%EF%BC%8C%E4%B9%9F%E6%98%AF%E7%BA%BF%E7%A8%8B%E5%AE%89%E5%85%A8%E7%9A%84%EF%BC%8C%E7%BB%A7%E6%89%BF%E4%BA%8EVector%E3%80%82 https://zhuanlan.zhihu.com/p/627192919 52. 方法重载和方法重写的区别 https://zhuanlan.zhihu.com/p/64732121 https://blog.csdn.net/weixin_44502804/article/details/90523478 53. 常见错误码以及问题原因出现在哪里如何排查 如500 https://blog.csdn.net/qq_36701194/article/details/111275451 https://zhuanlan.zhihu.com/p/96086467 54. 哈希冲突的避免和解决方法 https://zhuanlan.zhihu.com/p/346079114#:~:text%E8%A7%A3%E5%86%B3hash%E5%86%B2%E7%AA%81%E7%9A%84%E4%B8%89%E4%B8%AA%E6%96%B9%E6%B3%95%201%20%E4%BC%AA%E9%9A%8F%E6%9C%BA%E6%8E%A2%E6%B5%8B%E5%86%8D%E6%95%A3%E5%88%97%20di%3D%E4%BC%AA%E9%9A%8F%E6%9C%BA%E6%95%B0%E5%BA%8F%E5%88%97%E3%80%82%20…%202%20%E5%86%8D%E5%93%88%E5%B8%8C%E6%B3%95%20%E8%BF%99%E7%A7%8D%E6%96%B9%E6%B3%95%E6%98%AF%E5%90%8C%E6%97%B6%E6%9E%84%E9%80%A0%E5%A4%9A%E4%B8%AA%E4%B8%8D%E5%90%8C%E7%9A%84%E5%93%88%E5%B8%8C%E5%87%BD%E6%95%B0%EF%BC%9A,%E7%BC%BA%E7%82%B9%EF%BC%9A%20%E2%91%A0%E5%AD%98%E5%82%A8%E7%9A%84%E8%AE%B0%E5%BD%95%E6%98%AF%E9%9A%8F%E6%9C%BA%E5%88%86%E5%B8%83%E5%9C%A8%E5%86%85%E5%AD%98%E4%B8%AD%E7%9A%84%EF%BC%8C%E8%BF%99%E6%A0%B7%E5%9C%A8%E6%9F%A5%E8%AF%A2%E8%AE%B0%E5%BD%95%E6%97%B6%EF%BC%8C%E7%9B%B8%E6%AF%94%E7%BB%93%E6%9E%84%E7%B4%A7%E5%87%91%E7%9A%84%E6%95%B0%E6%8D%AE%E7%B1%BB%E5%9E%8B%EF%BC%88%E6%AF%94%E5%A6%82%E6%95%B0%E7%BB%84%EF%BC%89%EF%BC%8C%E5%93%88%E5%B8%8C%E8%A1%A8%E7%9A%84%E8%B7%B3%E8%BD%AC%E8%AE%BF%E9%97%AE%E4%BC%9A%E5%B8%A6%E6%9D%A5%E9%A2%9D%E5%A4%96%E7%9A%84%E6%97%B6%E9%97%B4%E5%BC%80%E9%94%80%20…%208%20%E5%B0%81%E9%97%AD%E6%95%A3%E5%88%97%EF%BC%88closed%20hashing%EF%BC%89%2F%20%E5%BC%80%E6%94%BE%E5%AE%9A%E5%9D%80%E6%B3%95%20%E6%9B%B4%E5%A4%9A%E9%A1%B9%E7%9B%AE https://blog.csdn.net/qq_48241564/article/details/118613312 https://blog.csdn.net/qq_41963107/article/details/107849048 55.
http://www.huolong8.cn/news/30206/

相关文章:

  • 门头沟区专业网站制作网站建设建设银行官方网站打不开啊
  • 中山做网站服务好ps里新建网站尺寸怎么做
  • 织梦医院网站模板一站式服务大厅官网
  • 怎样给网站做关键词优化记事本怎样做网站
  • 口碑好的福州网站建设网络部署方案
  • 计算机应用技术php网站开发论文网站建设格式
  • 网站建设项目实践山西手动网站建设推广
  • 房地产网站cms徐州网约车
  • 网站建设设计制作包头三个好消息
  • 如何建立网站快捷方式做一个企业网站价格
  • 凉山州城乡规划建设局网站网站后台编辑器
  • 网站优化培训中心网站建设协议书模板 完整版
  • 计算机网站建设职业群wordpress 导航站
  • 设计参考网站推荐彩票网站开发系统如何搭建
  • 泉州做网站联系方式wordpress评论美化插件
  • 重庆seo整站优化设置网站建设教程软件下载
  • 营销型网站建设式球磨机263企业邮箱登录入口手机版
  • 网站监测营销管理网站
  • 做网站一般注册商标哪个类分销系统方案
  • 网站开发有专利吗网上营销网站
  • 牛商网建设的食品网站深圳物流公司收费标准
  • 哪里可以做免费的物流网站电竞网站开发需求报告
  • 广东省建设工程执业中心网站如何做自己官方网站
  • 网站怎么做电脑系统下载江苏省网站备案查询
  • 网站建设有关要求宣传片制作公司推荐
  • 技术支持 骏域网站建设专家佛山比58同城做的好的网站
  • google网站搜索知名设计品牌有哪些
  • 中山微网站建设多少钱wordpress504
  • 专业个人网站建设o2o网站开发公司
  • 如何提高网站关键词的排名wordpress提交工单