> 文章列表 > 模拟面试总结

模拟面试总结

模拟面试总结

个人介绍:个人经历:基本经历,学了哪些课程,掌握了哪些测试技能,实习经历

  1. JDK1.8 支持的新特性
  • Lambda表达式
  • 函数式接口
  • *方法引用和构造器调用
  • Stream API
  • 接口中的默认方法和静态方法
  • 新时间日期API

2.static和final的区别

  • 静态方法final
  • final修饰的常量,不可变的,对象里面的内容可变
  • static 修饰的成员变量 全局,内容不可变的,引用可以变的
  1. 数组和链表的区别
  • 链表与数组在计算机中存储元素采用不同的物理存储结构,数组是顺序存储结构,数组用一组地址连续的存储单元来存储表中的元素;链表是链式存储结构,链式存储结构不要求逻辑上相邻的两个元素在物理位置上也相邻,链表元素除了存储元素本身的数据外,还需要存储一个指向下一个元素的位置数据,程序可以通过该信息访问到下一个元素
  • 数组插入和删除,查找比较快,支持随机访问;链表插入删除快
  1. 哈希map
  • 空间冲突问题:不严重是二叉树,集中在一个链表上,查找效率比较慢;严重是一颗红黑树;长度等于8的时间
  1. 进程和线程区别
  • 进程是操作系统资源分配的最小单元;进程是操作系统对一个正在运行的程序的一种抽象,可以把进程看作程序运行的一次运行过程
  • 线程是操作系统能够进行运算调度的最小单元。它被包含在进程中,是进程中实际运行的单位。一个进程中可以并发多个线程,每个线程执行不同的任务
  • 进程的创建、销毁和切换的开销都远大于线程
  • PID:进程ID,是进程的唯一身份标识,但是它不是固定不变的,是每次启动进程时动态分配的
  • 进程状态:①新建状态(NEW) ②就绪状态 ③运行状态 ④阻塞状态 ⑤销毁状态
  1. JVM
  2. 传输层 TCP UDP 的区别
  • TCP 是面向连接的、可靠的流协议。。TCP 为提供可靠性传输,实行“顺序控制”或“重发控制”机制。此外还具备“流控制(流量控制)”、“拥塞控制”、提高网络利用率等众多功能
  • UDP 是不具有可靠性的数据报协议。细微的处理它会交给上层的应用去完成。在 UDP 的情况下,虽然可以确保发送消息的大小,却不能保证消息一定会到达。因此,应用有时会根据自己的需要进行重发处理
  • TCP 用于在传输层有必要实现可靠传输的情况;而在一方面,UDP 主要用于那些对高速传输和实时性有较高要求的通信或广播通信。TCP 和 UDP 应该根据应用的目的按需使用
  • TCP:几乎所有必须获取所有传输数据的地方:卷筒纸、SSH,FTP,telnet、SMTP,发送邮件、IMAP/POP,接收邮件;
  • UDP:如果总是得到所有数据,那么你不在乎的任何东西;隧道/ @-@(丢失的数据包没问题 - 隧道协议负责处理)、媒体流(丢帧可以)、如果你得到每次更新都不关心的游戏、本地广播机制(在不同机器上运行的相同应用程序"相互发现")
  1. 三次握手
  • 三次握手(Three-way Handshake)其实就是指建立一个TCP连接时,需要客户端和服务器总共发送3个包。进行三次握手的主要作用就是为了确认双方的接收能力和发送能力是否正常、指定自己的初始化序列号为后面的可靠性传送做准备。实质上其实就是连接服务器指定端口,建立TCP连接,并同步连接双方的序列号和确认号,交换TCP窗口大小信息
  • 第一次握手:客户端给服务端发一个 SYN 报文,并指明客户端的初始化序列号 ISN。此时客户端处于 SYN_SENT 状态。
    首部的同步位SYN=1,初始序号seq=x,SYN=1的报文段不能携带数据,但要消耗掉一个序号。
  • 第二次握手:服务器收到客户端的 SYN 报文之后,会以自己的 SYN 报文作为应答,并且也是指定了自己的初始化序列号 ISN(s)。同时会把客户端的 ISN + 1 作为ACK 的值,表示自己已经收到了客户端的 SYN,此时服务器处于 SYN_RCVD 的状态。在确认报文段中SYN=1,ACK=1,确认号ack=x+1,初始序号seq=y。
  • 第三次握手:客户端收到 SYN 报文之后,会发送一个 ACK 报文,当然,也是一样把服务器的 ISN + 1 作为 ACK 的值,表示已经收到了服务端的 SYN 报文,此时客户端处于 ESTABLISHED 状态。服务器收到 ACK 报文之后,也处于 ESTABLISHED 状态,此时,双方已建立起了连接。确认报文段ACK=1,确认号ack=y+1,序号seq=x+1(初始为seq=x,第二个报文段所以要+1),ACK报文段可以携带数据,不携带数据则不消耗序号。
    模拟面试总结
  1. 为什么是三次握手,不是两次?
    弄清这个问题,我们需要先弄明白三次握手的目的是什么,能不能只用两次握手来达到同样的目的。
  • 第一次握手:客户端发送网络包,服务端收到了。 这样服务端就能得出结论:客户端的发送能力、服务端的接收能力是正常的。
  • 第二次握手:服务端发包,客户端收到了。
    这样客户端就能得出结论:服务端的接收、发送能力,客户端的接收、发送能力是正常的。不过此时服务器并不能确认客户端的接收能力是否正常。
  • 第三次握手:客户端发包,服务端收到了。 这样服务端就能得出结论:客户端的接收、发送能力正常,服务器自己的发送、接收能力也正常。
    因此,需要三次握手才能确认双方的接收与发送能力是否正常。

试想如果是用两次握手,则会出现下面这种情况:

如客户端发出连接请求,但因连接请求报文丢失而未收到确认,于是客户端再重传一次连接请求。后来收到了确认,建立了连接。数据传输完毕后,就释放了连接,客户端共发出了两个连接请求报文段,其中第一个丢失,第二个到达了服务端,但是第一个丢失的报文段只是在某些网络结点长时间滞留了,延误到连接释放以后的某个时间才到达服务端,此时服务端误认为客户端又发出一次新的连接请求,于是就向客户端发出确认报文段,同意建立连接,不采用三次握手,只要服务端发出确认,就建立新的连接了,此时客户端忽略服务端发来的确认,也不发送数据,则服务端一致等待客户端发送数据,浪费资源。

  1. 四次挥手:四次挥手等待的 2倍的等待的时间
  • 建立一个连接需要三次握手,而终止一个连接要经过四次挥手(也有将四次挥手叫做四次握手的)。这由TCP的半关闭(half-close)造成的。所谓的半关闭,其实就是TCP提供了连接的一端在结束它的发送后还能接收来自另一端数据的能力。
  • 第一次挥手:客户端发送一个 FIN 报文,报文中会指定一个序列号。此时客户端处于 FIN_WAIT1 状态。
    即发出连接释放报文段(FIN=1,序号seq=u),并停止再发送数据,主动关闭TCP连接,进入FIN_WAIT1(终止等待1)状态,等待服务端的确认。
  • 第二次挥手:服务端收到 FIN 之后,会发送 ACK 报文,且把客户端的序列号值 +1 作为 ACK
    报文的序列号值,表明已经收到客户端的报文了,此时服务端处于 CLOSE_WAIT 状态。
    即服务端收到连接释放报文段后即发出确认报文段(ACK=1,确认号ack=u+1,序号seq=v),服务端进入CLOSE_WAIT(关闭等待)状态,此时的TCP处于半关闭状态,客户端到服务端的连接释放。客户端收到服务端的确认后,进入FIN_WAIT2(终止等待2)状态,等待服务端发出的连接释放报文段。
  • 第三次挥手:如果服务端也想断开连接了,和客户端的第一次挥手一样,发给 FIN 报文,且指定一个序列号。此时服务端处于 LAST_ACK的状态。
    即服务端没有要向客户端发出的数据,服务端发出连接释放报文段(FIN=1,ACK=1,序号seq=w,确认号ack=u+1),服务端进入LAST_ACK(最后确认)状态,等待客户端的确认。
  • 第四次挥手:客户端收到 FIN 之后,一样发送一个 ACK 报文作为应答,且把服务端的序列号值 +1 作为自己 ACK
    报文的序列号值,此时客户端处于 TIME_WAIT 状态。需要过一阵子以确保服务端收到自己的 ACK 报文之后才会进入 CLOSED状态,服务端收到 ACK 报文之后,就处于关闭连接了,处于 CLOSED 状态。
    即客户端收到服务端的连接释放报文段后,对此发出确认报文段(ACK=1,seq=u+1,ack=w+1),客户端进入TIME_WAIT(时间等待)状态。此时TCP未释放掉,需要经过时间等待计时器设置的时间2MSL后,客户端才进入CLOSED状态。

模拟面试总结

  1. 应用层协议
    HTTP80 HTTPS443
  2. 事务的隔离级别
  • Read Uncommited,读未提交,即一个事务可以读取另一个未提交事务的数据;并发操作会导致脏读 Read
    -Commited,读操作,即一个事务要等到另一个事务提交后才能读取数据;解决脏读问题;并发操作会导致不可重复读 Repeatable
    -Read,重复读,即开始读取数据(事务开启)时,不再允许修改操作;解决不可重复读问题;并发操作会导致幻读(对应insert操作)
  • Serializable,序列化,最高的事务隔离级别,该级别下,事务串行化顺序执行;避免脏读、不可重复读与幻读;但是该级别效率低下,比较消耗数据库性能,一般不用。
  1. MySql-动态sql 拼接 if语句、for each 语句
  2. group by having 不用where
  3. 黑盒和白盒测试
  • 黑盒测试又称功能测试或者基于需求的测试。

  • 主要的测试方法包括边界值分析法、等价类划分法、错误推断法等

边界值分析法:根据以往经验,大多数问题发生在数据的边界处。使用该方法需要,第一:确定测试单元输入信号的边界值;第二:用正等于边界值、略小于边界值、略大于边界值编写测试用例进行测试。

等价类划分法:把输入信号的范围分为若干子集,在每个子集中选取有少量有代表性的数据编写测试用例

错误推断法:根据经验分析,那些场景或者工况容易产生问题,针对性的设置用例进行测试

-白盒测试又称结构测试或者逻辑驱动的测试。

在白盒测试又分为静态分析动态分析两类。

静态分析是指不运行待测试的程序,通过代码检测、静态结构分析等通过工程师的逻辑思维去检查代码是否存在问题的方法。

动态分析是指运行待测试程序进行测试的方法统称。

  • 白盒测试的目的:

a 对程序模块的所有独立的执行路径至少测试一次

b 对所有的逻辑判定,取“真”与取“假”的两种情况都至少测试一次

c 在循环的边界和运行界限内执行循环体

d 测试内部数据结构的有效性等

  1. 快速排序
public class HelloWord {public static void main(String[] args) {int[] arr = {10, 7, 4, 5, 65, 67, 5, 6, 20};quickSort(arr, 0, arr.length - 1);for (int i = 0; i < arr.length; i++) {System.out.println(arr[i]);}}public static void quickSort(int []arr,int low,int high){int i,j,temp,t;if(low>high){return;}i=low;j=high;temp=arr[low];while(i<j){while (temp <= arr[j] && i < j) {j--;}while(temp>=arr[i]&&i<j){i++;}if (i < j) {t=arr[j];arr[j]=arr[i];arr[i]=t;}}arr[low]=arr[i];arr[i]=temp;quickSort(arr,low,j-1);quickSort(arr,j+1,high);}
}

实习经历描述:参与的项目,项目背景,问题怎么解决的
项目经历描述:背景,主要模块,遇到的问题怎么解决的;项目:分成哪些大块 功能 背景模块 过程中遇到的一个挑战性 遇到的问题 难点 以及自己的解决方法