秋招面试常问知识点

秋招面试常问知识点

  • 一、Java部分
    • 1. java的数据类型
      • 1.1 基本数据类型
      • 1.2 引用类型
    • 2. Java的三大特性
      • 2.1 继承
      • 2.2 封装
      • 2.3 多态
    • 3. 重载和重写
    • 4. StringBuilder和StringBuffer的区别
    • 5. &和&&的区别?
    • 6. 线程和进程的区别
    • 7. 线程死锁
    • 8. 为什么要用线程池
    • 9. List、Set、Map的区别
    • 10. 普通类和抽象类有哪些区别?
    • 11. 抽象类必须要有抽象方法吗?
    • 12. 接口和抽象类的区别
    • 13. Collection和Collections有什么区别?
    • 14. ==和equals有什么区别?
    • 15. 迭代器Iterator是什么?
    • 16. Iterator和ListIterator有什么区别?
    • 17. 深拷贝和浅拷贝区别是什么
    • 18.成员变量和局部变量的区别?
  • 二、 数据结构和算法
    • 1. 数据结构有哪些
    • 2. 链表
    • 3. 二叉树
    • 4. 平衡二叉树
    • 5. B树和B+树的区别?
    • 6. 排序算法原理
      • 6.1 冒泡排序
      • 6.2 快速排序
      • 6.3 插入排序
      • 6.4 希尔排序
      • 6.5 选择排序
      • 6.6 堆排序
      • 6.7 归并排序
    • 7. 算法复杂度和稳定性
    • 8. 栈和队列的区别
    • 9. 栈和堆的区别
  • 三、数据库
    • 1. 数据库的四大特性
    • 2. 数据库的索引
    • 3. 使用索引查询一定能提高查询的性能吗?为什么?
    • 4. 数据库引擎
    • 5. 数据库的完整性约束
    • 6. 数据库的三级模式结构
    • 7. 数据独立性
    • 8. 非关系型数据库和关系型数据库区别,优势比较?
    • 9. 数据库保护
    • 10. union和union all有什么不同?
    • 11. order by与group by的区别
  • 四、软件测试
    • 1. 什么是负载测试和压力测试
    • 2. 给你一个接口你如何测试?
    • 3. 软件测试的流程
    • 4. 测试用例的设计
  • 五. 计算机网络
    • 1. HTTP和HTTPS的区别
    • 2. 三次握手和四次挥手

♠ \color{red}{\spadesuit}
其实面试问及的知识点不外乎就是数据库、数据结构、java(我学的是java的哈,其他Python、Ruby的我就介绍不来了)、计算机网络。所以我打算分类整理这些知识点,算是对自己所学知识的一个复习,也为秋招面试做准备。。加油~

下面这篇是汇总了秋招面试的常考知识点,包含Java、数据结构、数据库、软件测试、计算机网络。
♠ \color{pink}{\spadesuit}

一、Java部分

1. java的数据类型

java的数据类型真的是面试时比较常考的点,记得当时面试实习生时也被问到了这个知识点,可以看一下我的这篇测试实习面试都问啥

JAVA语言中将数据类型分为两大类,一类是基本数据类型,另一类是引用类型。基本数据类型有整型、浮点型、逻辑型和字符型。引用数据类型有类、数组和接口等。

1.1 基本数据类型

整型:byte、int、short、long
浮点型:float、double
布尔型:Boolean
字符型:char

1.2 引用类型

类、数组和接口

2. Java的三大特性

Java是面向对象的语言,具有三大特点:继承、封装和多态

2.1 继承

继承:继承是为了实现代码的复用,通过extends关键字来实现,每个子类只有一个父类。

2.2 封装

封装:封装是指将对象的状态信息隐藏在对象内部,不允许外部程序直接访问对象内部信息,而是通过类所提供的方法来实现对内部信息的操作和访问。(好处就是用户不必关心类是怎么实现的,只需要知道方法的调用信息就可以了,提高了代码的维护性)

2.3 多态

多态: 一个子类继承了父类并且重写了父类中的方法,当子类对象和父类对象调用这个方法时会产生不同的行为。(好处就是每个子类都可以按自己的需要重写父类中的方法)

3. 重载和重写

方法重载:同一个类中,方法名相同,参数类型和参数个数不同,返回类型可以相同也可以不同;最常用的地方就是构造器的重载。

方法重写:是子类对父类中可以访问的方法重新编写,方法名相同,返回值和形参都不能改变,方法体不同
重写的好处是子类可以根据需要,定义属于自己的行为。重写的方法不能抛出比被重写的方法更加宽泛的异常,权限修饰符不能比被重写的方法权限更大。

构造方法可重载但不可重写

方法的重载和重写都是实现多态的方式,区别在于前者实现的是编译时的多态性,而后者实现的是运行时的多态性。重载发生在一个类中,同名的方法如果有不同的参数列表(参数类型不同、参数个数不同或者二者都不同)则视为重载;重写发生在子类与父类之间,重写要求子类被重写方法与父类被重写方法有相同的返回类型,比父类被重写方法更好访问,不能比父类被重写方法声明更多的异常(里氏代换原则)。重载对返回类型没有特殊的要求。

4. StringBuilder和StringBuffer的区别

String:字符串常量,底层实现由final char[] 存储字符串,由于被final修饰,每次增删操作都需要创建新的String对象,当进行大量字符串操作时,会生成大量无用的对象,导致系统JVM调用GC机制进行处理,资源浪费
StringBuilder:字符串变量,因为没有final修饰,只需要创建一个对象,然后对引用的值进行修改即可
String 一般用于少量字符串操作,如常量的声明,少量的字符串操作(拼接,删除等);
StringBuilder用于单线程下大量字符串操作,如JSON的封装;不是线程安全
StringBuffer用于多线程下大量字符串操作,如HTTP参数解析和封装等;线程安全

5. &和&&的区别?

&运算符有两种用法:(1)按位与;(2)逻辑与。&&运算符是短路与运算。逻辑与跟短路与的差别是非常巨大的,虽然二者都要求运算符左右两端的布尔值都是true整个表达式的值才是true。&&之所以称为短路运算是因为,如果&&左边的表达式的值是false,右边的表达式会被直接短路掉,不会进行运算。很多时候我们可能都需要用&&而不是&,例如在验证用户登录时判定用户名不是null而且不是空字符串,应当写为:username != null &&!username.equals(“”),二者的顺序不能交换,更不能用&运算符,因为第一个条件如果不成立,根本不能进行字符串的equals比较,否则会产生NullPointerException异常。注意:逻辑或运算符(|)和短路或运算符(||)的差别也是如此。

6. 线程和进程的区别

还会问线程的状态、创建线程的方法。看这篇☞线程和进程的区别

7. 线程死锁

当两个线程都有自己的锁而且相互等待对方释放锁时就会发生死锁,会导致线程都无法执行,程序一直停留在发生死锁的地方无法继续执行,便会发生死锁。

8. 为什么要用线程池

因为每执行一个任务我们就要启动一个线程,这对于小型应用是可行的,但对于大型应用,比如高并发的web服务器,需要启动大量的线程,而线程的创建与销毁都会消耗大量的资源,因此就需要写一个类,来具体的管理线程,就是线程池,它内部已经创建了若干个线程,我们将需要执行的任务提交给线程池,线程池就会安排空闲的线程来执行任务,执行完毕后就调用sleep() 方法使线程休眠,等有新的任务时再使用notify方法唤醒线程,提高线程的复用率。

9. List、Set、Map的区别

这一个问题真的挺重要的,当时面试的时候被问到了,所以我专门整理了一篇这个的介绍,需要的童鞋移步到List、Set和Map详解看看

10. 普通类和抽象类有哪些区别?

  • 抽象类不能被实例化
  • 抽象类可以有抽象方法,抽象方法只需申明,无需实现
  • 含有抽象方法的类必须申明为抽象类
  • 抽象的子类必须实现抽象类中所有抽象方法,否则这个子类也是抽象类
  • 抽象方法不能被声明为静态
  • 抽象方法不能用private修饰
  • 抽象方法不能用final修饰

11. 抽象类必须要有抽象方法吗?

抽象类可以没有抽象方法,但是如果一个类已经声明成了抽象类,即使这个类中没有抽象方法,它也不能再实例化,即不能直接构造一个该类的对象。
如果一个类中有了一个抽象方法,那么这个类必须声明为抽象类,否则编译通不过。

12. 接口和抽象类的区别

抽象类中可以有普通属性,构造方法,普通方法,抽象方法;
接口中只能包含抽象方法和public static final属性;
一个类只能继承一个抽象类;
一个接口可以继承多个接口;
一个类可以实现多个接口(implements);
抽象类表示一个概念,而接口则表示一种能力;

13. Collection和Collections有什么区别?

Collcetion是一个集合接口,它提供了对集合对象进行基本操作的通用接口方法。实现该接口的类主要有List和Set,该接口的设计目标是为各种具体的集合提供最大化的统一操作方式。
Collections是针对集合类的一个包装类,它提供了一系列的静态方法以实现对各种集合的搜索、排序、线程安全化等操作,其中大多数方法都是用来处理线性表。 Collections类不能实例化,如同一个工具类,服务于Collection。若是在使用Collections类的方法时候,对应的collection的对象为null,则这些方法都会抛出 NullPointerException 。之前我们见到的包装类还有Arrays,它是为数组提供服务的。

14. ==和equals有什么区别?

对象类型不同
equals()是超类Object中的方法。
== 是操作符。
比较的对象不同
equals()用来检测两个对象是否相等,即两个对象的内容是否相等。
== 用于比较引用和比较基本数据类型时具有不同的功能。

15. 迭代器Iterator是什么?

迭代器是一种设计模式,它是一个对象,它可以遍历并选择序列中的对象,而开发人员不需要了解该序列的底层结构。迭代器通常被称为“轻量级”对象,因为创建它的代价小。
Java中的Iterator功能比较简单,并且只能单向移动:
(1) 使用方法iterator()要求容器返回一个Iterator。第一次调用Iterator的next()方法时,它返回序列的第一个元素。注意:iterator()方法是java.lang.Iterable接口,被Collection继承。
(2) 使用next()获得序列中的下一个元素。
(3) 使用hasNext()检查序列中是否还有元素。
(4) 使用remove()将迭代器新返回的元素删除。
Iterator是Java迭代器最简单的实现,为List设计的ListIterator具有更多的功能,它可以从两个方向遍历List,也可以从List中插入和删除元素。
特点

Iterator遍历集合元素的过程中不允许线程对集合元素进行修改,否则会抛出ConcurrentModificationEception的异常。
Iterator遍历集合元素的过程中可以通过remove方法来移除集合中的元素。
Iterator必须依附某个Collection对象而存在,Iterator本身不具有装载数据对象的功能。
Iterator.remove方法删除的是上一次Iterator.next()方法返回的对象。
强调以下next()方法,该方法通过游标指向的形式返回Iterator下一个元素。

16. Iterator和ListIterator有什么区别?

Iterator可用来遍历Set和List集合,但是ListIterator只能用来遍历List。
Iterator对集合只能是前向遍历,ListIterator既可以前向也可以后向。
ListIterator实现了Iterator接口,并包含其他的功能,比如:增加元素,替换元素,获取前一个和后一个元素的索引等等。
ListIterator有add()方法,可以向List中添加对象,而Iterator不能
ListIterator和Iterator都有hasNext()和next()方法,可以实现顺序向后遍历,但是ListIterator有hasPrevious()和previous()方法,可以实现逆向(顺序向前)遍历。Iterator就不可以。
ListIterator可以定位当前的索引位置,nextIndex()和previousIndex()可以实现。Iterator没有此功能。
都可实现删除对象,但是ListIterator可以实现对象的修改,set()方法可以实现。Iierator仅能遍历,不能修改。

17. 深拷贝和浅拷贝区别是什么

浅拷贝只是复制了对象的引用地址,两个对象指向同一个内存地址,所以修改其中任意的值,另一个值都会随之变化,这就是浅拷贝(例:assign())
深拷贝是将对象及值复制过来,两个对象修改其中任意的值另一个值不会改变,这就是深拷贝(例:JSON.parse()和JSON.stringify(),但是此方法无法复制函数类型)

参考 java面试题(208道面试题包含所有知识点)

18.成员变量和局部变量的区别?

(1)作用域不同
成员变量:对整个类都有效;
局部变量:只在方法或语句块中有效
(2)存储位置不同
成员变量:存放于堆内存中,随着对象的创建而存在,随着对象的消失而消失
局部变量:存放于栈内存中,当方法被调用或语句体被执行时存在,当方法调用结束或语句块执行结束,自动释放内存
(3)初始值不同
成员变量:有默认的初始值
局部变量:没有默认的初始值,必须赋值
♠ \color{pink}{\spadesuit}

二、 数据结构和算法

1. 数据结构有哪些

常用数据结构:数组(静态数组、动态数组)、线性表、链表(单向链表、双向链表、循环链表)、队列、栈、树(二叉树、查找树、平衡树、线索树、线索树、堆)、图等的定义、存储和操作Hash(存储地址计算,冲突处理)。数据结构是指相互之间存在着一种或多种关系的数据元素的集合和该集合中数据元素之间的关系组成 。

2. 链表

链表是一种数据结构,它的每个节点都包含了一个数据区和一个指针区,数据区用来存放数据,指针区用来指向下一节点,这样多个节点就构成了一条链表,优点是可以快速的增加和删除节点。

3. 二叉树

二叉树是一种数据结构,由根节点和它的子节点构成,每个节点有一个数据域用来保存数据,有两个指针域分别指向左节点和右节点。
二叉树的用法:通过构造二叉排序树可以实现数组排序,二叉排序树就是树的左节点值都小于它的根节点的值,右节点值都大于根节点的值。通过中序遍历可以得到一个有序序列。

4. 平衡二叉树

平衡二叉树:
它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。

5. B树和B+树的区别?

需要的童鞋看下这篇B树和B+树

6. 排序算法原理

6.1 冒泡排序

冒泡排序就是对于一个数组,通过n次遍历,比较相邻的元素,如果第一个比第二个大,就交换它们两个;这样就实现了从小到大的排序。采用了分治法思想。

6.2 快速排序

快排:就是使用一个指针指向某一个元素,然后先从后往前找到第一个比它小的元素,交换元素值,然后再从前往后找到第一个比它大的元素,再交换元素值。然后使用递归或者非递归的方法重复这些操作,只到元素被排好序。

6.3 插入排序

插入排序:通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。插入排序在实现上,通常采用in-place排序(即只需用到O(1)的额外空间的排序),因而在从后向前扫描过程中,需要反复把已排序元素逐步向后挪位,为最新元素提供插入空间。

6.4 希尔排序

希尔排序:又称为缩小增量排序。希尔排序的基本思想是:把记录按步长 gap 分组,对每组记录采用直接插入排序方法进行排序;随着步长逐渐减小,所分成的组包含的记录越来越多,当步长的值减小到 1 时,整个数据合成为一组,构成一组有序记录,则完成排序。希尔排序与插入排序的区别在于它会优先比较距离较远的元素。

6.5 选择排序

选择排序工作原理:首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。

6.6 堆排序

堆排序:把要排序的n个数看作是一棵顺序存储的二叉树,调整它们的存储序号,使它成为一个小根堆,将堆顶元素输出,得到n个元素中最小的元素。然后对剩下的n-1个元素按同样的方法递归。(堆中某节点的值总是不大于或不小于其父节点的值)

6.7 归并排序

归并排序:先把n个元素拆分为一个个独立的区间,再利用区间两两合并的方法直到产生一个顺序序列。采用了分治法思想。

♢ \color{red}{\diamondsuit} 如果是偏向于测试开发岗的面试,这几大算法是高频考察点,详看这篇数据结构十大经典算法(面试常问)帮助加深理解这几大算法。

7. 算法复杂度和稳定性

算法 时间复杂度(平均) 稳定性
冒泡排序 O(n2) 稳定 \color{red}{稳定} 稳定
快速排序 nlog2n 不稳定
希尔排序 O(n1.3) 不稳定
插入排序 O(n2) 稳定 \color{red}{稳定} 稳定
选择排序 O(n2) 不稳定
堆排序 O(nlog2n) 不稳定
归并排序 O(nlog2n) 稳定 \color{red}{稳定} 稳定

空间复杂度:快速排序 O(nlog2n),其它都是O(1)

稳定的排序方法:冒泡排序、插入排序 、归并排序

8. 栈和队列的区别

栈是先进后出,队列是先进先出
栈的插入和删除操作都只能在栈顶进行,而一般的线性表可以在线性表的任何位置进行插入和删除操作;队列的删除只能在队头进行,队列的插入只能在队尾进行。而一般的线性表可以在线性表的任何位置进行插入和删除操作。

9. 栈和堆的区别

  • 栈(数据结构):一种先进后出的数据结构。
  • 堆(数据结构):堆可以被看成是一棵树,如:堆排序。
  1. 程序的内存分配方式不同
    栈区(stack):编译器自动分配释放,存放函数的参数值,局部变量的值等,其操作方式类似于数据结构的栈。
    堆区(heap):一般是由程序员分配释放,若程序员不释放的话,程序结束时可能由OS回收,值得注意的是他与数据结构的堆是两回事,分配方式倒是类似于数据结构的链表。
  2. 申请方式不同
    stack 由系统自动分配,heap需要程序员自己申请。
    C 中用函数malloc分配空间,用free释放,C++用new分配,用delete释放。
  3. 申请后系统的响应不同
    栈:只要栈的剩余空间大于所申请的空间,系统将为程序提供内存,否则将报异常提示栈溢出。
    堆:首先应该知道操作系统有一个记录内存地址的链表,当系统收到程序的申请时,遍历该链表,寻找第一个空间大于所申请的空间的堆结点,然后将该结点从空闲结点链表中删除,并将该结点的空间分配给程序。另外,对于大多数系统,会在这块内存空间中的首地址处记录本次分配的大小,这样代码中的delete或free语句就能够正确的释放本内存空间。另外,由于找到的堆结点的大小不一定正好等于申请的大小,系统会将多余的那部分重新放入空闲链表中。
  4. 申请的大小限制不同
    栈:在windows下,栈是向低地址扩展的数据结构,是一块连续的内存区域,栈顶的地址和栈的最大容量是系统预先规定好的,能从栈获得的空间较小。
    堆:堆是向高地址扩展的数据结构,是不连续的内存区域,这是由于系统是由链表在存储空闲内存地址,自然堆就是不连续的内存区域,且链表的遍历也是从低地址向高地址遍历的,堆得大小受限于计算机系统的有效虚拟内存空间,由此空间,堆获得的空间比较灵活,也比较大。
  5. 申请的效率不同
    栈:栈由系统自动分配,速度快,但是程序员无法控制。
    堆:堆是有程序员自己分配,速度较慢,容易产生碎片,不过用起来方便。
  6. 堆和栈的存储内容不同
    栈:在函数调用时,第一个进栈的是主函数中函数调用后的下一条指令的地址,然后函数的各个参数,在大多数的 C 编译器中,参数是从右往左入栈的,当本次函数调用结束后,局部变量先出栈,然后是参数,最后栈顶指针指向最开始存的地址,也就是主函数中的下一条指令。
    堆:一般是在堆的头部用一个字节存放堆的大小,具体内容由程序员安排。
    ♡ \color{red}{\heartsuit}

三、数据库

1. 数据库的四大特性

原子性、一致性、隔离性、持久性(ACID)详细解析请戳☞数据库事务的四大特性和事务的隔离级别

2. 数据库的索引

数据库索引的分类有哪些?你所知道的数据库索引有哪些?什么场景下适合创建索引,什么场景不适合创建索引?索引的作用?
这些是需要去了解的点,面试会涉及,因为问题比较多,由索引引出来的问题也比较多,问题之间的关联性比较强,所以我专门做了一篇介绍,需要的童鞋详看数据库索引

3. 使用索引查询一定能提高查询的性能吗?为什么?

在数据之外,数据库系统还维护着满足特定查找算法的数据结构,这些数据结构以某种方式引用(指向)数据,这样就可以在这些数据结构上实现高级查找算法。这种数据结构,就是索引。

通常,通过索引查询数据比全表扫描要快.但是我们也必须注意到它的代价. 索引需要空间来存储,也需要定期维护, 每当有记录在表中增减或索引列被修改时,索引本身也会被修改. 这意味着每条记录的INSERT,DELETE,UPDATE将为此多付出4,5 次的磁盘I/O. 因为索引需要额外的存储空间和处理,那些不必要的索引反而会使查询反应时间变慢.使用索引查询不一定能提高查询性能

4. 数据库引擎

面试时偶尔会被问到,需要童鞋可以看一下MySQL的两种存储引擎

5. 数据库的完整性约束

数据库的完整性是指数据的正确性和相容性。数据的正确性是指数据是符合现实世界语义、反映当前实际状况的。数据的相容性是指数据库同一对象在不同关系表中的数据是符合逻辑的。

♢ \color{green}{\diamondsuit} 域完整性:是指一个列的输入有效性,是否允许为空值。强制域完整性的方法有:限制类型(通过设定列的数据类型)、格式(通过CHECK约束和规则)或可能值的范围(通过FOREIGN KEY约束、CHECK约束、DEFAULT定义、NOT NULL定义和规则)。如:学生的考试成绩必须在0~100之间,性别只能是“男”或“女”。

♢ \color{yellow}{\diamondsuit} 实体完整性:是指保证表中所有的行唯一。实体完整性要求表中的所有行都有一个唯一标识符。这个唯一标识符可能是一列,也可能是几列的组合,称为主键。也就是说,表中的主键在所有行上必须取唯一值。强制实体完整性的方法有:索引、UNIQUE约束、PRIMARY KEY约束或IDENTITY属性。如:student表中sno(学号)的取值必须唯一,它唯一标识了相应记录所代表的学生,学号重复是非法的。学生的姓名不能作为主键,因为完全可能存在两个学生同名同姓的情况。

♢ \color{blue}{\diamondsuit} 参照完整性:是指保证主关键字(被引用表)和外部关键字(引用表)之间的参照关系。它涉及两个或两个以上表数据的一致性维护。外键值将引用表中包含此外键的记录和被引用表中主键与外键相匹配的记录关联起来。在输入、更改或删除记录时,参照完整性保持表之间已定义的关系,确保键值在所有表中一致。这样的一致性要求确保不会引用不存在的值,如果键值更改了,那么在整个数据库中,对该键值的所有引用要进行一致的更改。参照完整性是基于外键与主键之间的关系。例如学生学习课程的课程号必须是有效的课程号,score表(成绩表)的外键cno(课程号)将参考course表(课程表)中主键cno(课程号)以实现数据完整性。

♢ \color{pink}{\diamondsuit} 用户定义完整性
 实体完整性和参照完整性适用于任何关系型数据库系统,它主要是针对关系的主关键字和外部关键字取值必须有效而做出的约束。用户定义完整性则是根据应用环境的要求和实际的需要,对某一具体应用所涉及的数据提出约束性条件。这一约束机制一般不应由应用程序提供,而应有由关系模型提供定义并检验,用户定义完整性主要包括字段有效性约束和记录有效性。

域完整性、实体完整性及参照完整性分别在列、行、表上实施。数据完整性任何时候都可以实施,但对已有数据的表实施数据完整性时,系统要先检查表中的数据是否满足所实施的完整性,只有表中的数据满足了所实施的完整性,数据完整性才能实施成功。

6. 数据库的三级模式结构

1)外模式(子模式)是数据库用户能够看见和使用的局部数据的逻辑结构和特征的描述,是数据库用户的数据视图,是与某一应用有关的数据的逻辑表示。外模式通常是模式的子集,一个数据库可以有多个外模式(视图)

2)模式(逻辑模式)是数据库中全体数据的逻辑结构和特征的描述,是所有用户的公共数据视图,一个数据库只有一个模式。(基本表)

3)内模式(存储模式)是数据库物理结构和存储方式的描述,是数据在数据库内部的组织方式。(存储文件)

7. 数据独立性

♠ \color{pink}{\spadesuit} 逻辑独立性:当模式改变时,由数据库管理员对各个外模式/模式的映像作相应的改变,可以使外模式保持不变(应用程序是依据数据的外模式编写的,从而应用程序不必修改,保证了数据与程序的逻辑独立性)

♠ \color{pink}{\spadesuit} 物理独立性:当数据库存储结构改变时,由数据库管理员对各模式/内模式的映像作相应的改变,可以使模式保持不变,从而应用程序也不必改变,保证了数据与程序的物理独立性。

8. 非关系型数据库和关系型数据库区别,优势比较?

非关系型数据库的优势:

性能:NOSQL是基于键值对的,可以想象成表中的主键和值的对应关系,而且不需要经过SQL层的解析,所以性能非常高。
可扩展性:同样也是因为基于键值对,数据之间没有耦合性,所以非常容易水平扩展。
关系型数据库的优势:

复杂查询:可以用SQL语句方便的在一个表以及多个表之间做非常复杂的数据查询。
事务支持:使得对于安全性能很高的数据访问要求得以实现。
其他:

1.对于这两类数据库,对方的优势就是自己的弱势,反之亦然。
2.NOSQL数据库慢慢开始具备SQL数据库的一些复杂查询功能,比如MongoDB。
3.对于事务的支持也可以用一些系统级的原子操作来实现例如乐观锁之类的方法来曲线救国,比如Redis set nx。

9. 数据库保护

数据库保护分为安全性控制、完整性控制、并发性控制和数据的恢复

10. union和union all有什么不同?

UNION在进行表链接后会筛选掉重复的记录,所以在表链接后会对所产生的结果集进行排序运算,删除重复的记录再返回结果。实际大部分应用中是不会产生重复的记录,最常见的是过程表与历史表UNION。 UNION ALL只是简单的将两个结果合并后就返回。这样,如果返回的两个结果集中有重复的数据,那么返回的结果集就会包含重复的数据了。 从效率上说,UNION ALL 要比UNION快很多,所以,如果可以确认合并的两个结果集中不包含重复的数据的话,那么就使用UNION ALL。

11. order by与group by的区别

order by 排序查询、ASC升序、DESC降序 group by 分组查询、having 只能用于group by子句、作用于组内,having条件子句可以直接跟函数表达式。使用group by 子句的查询语句需要使用聚合函数。

四、软件测试

1. 什么是负载测试和压力测试

当时面试被问到了性能测试的相关知识点,性能测试的指标QPS和TPS以及负载、压力测试就自然而然也被问到了,看下这篇QPS和TPS的区别、负载和压力测试的区别

2. 给你一个接口你如何测试?

这个也是我面试被问到的一道题,当时面试官对我的回答并不满意,因为我回答的不是面试官想要的。他给我提出这个问题在我回答前和我说:“你先别急着回答这个问题,你可以先想想你拿到这个之后你有什么想要问我的吗?问清楚你再开始说你要怎么做,不用急着给我答案。”不过我当时稍微有点小紧张+确实没摸清面试官的一个心思的原因,所以回答的即使没有错,在面试官听来都是错误的,他心里想要的答案不是这个,自然就不会听你怎么回答。后来我知道,他想要的是一个工作中的情景模拟,是我实际工作中拿到这个接口后的一个最真实的做法和测试的一个思路。我的回答就很面试,没有把自己带入实际工作中遇到会怎么样,我反思了一下,第一、可能是我平常接口测试并不怎么多,第二、接口测试后没有复盘没有总结,实际上我在工作中拿到接口时并不是立马就执行测试那么简单,我忽略了执行测试前的一个沟通交流准备的过程,在工作中我拿到接口时,可能会问产品,这个接口的需求,功能、逻辑、需要业务逻辑上的一个测通,还是性能上的测试。如果是性能上的一个测试,那性能指标是多少。而我当时的回答就很急:拿到接口后根据接口文档,根据参数说明,传参,看返参结果和预期的是否一致,不一致和开发产品沟通,报bug,一致的话就通过……这么简单的一个流程。
不过我的回答可能放在其他面试上,谈不上是加分题,但肯定不是失分点。说了这么多。。。好吧,其实就是想告诉和我一样的朋友,面试回答问题时要学会摸清面试官的心思,有时候需要顺着面试官的心思回答问题,虽然这个好像有点难,但是挺重要的,不要死脑筋不懂得变通。
看这篇给你一个接口,你如何测试

3. 软件测试的流程

首先是召开需求计划;和产品、开发召开需求评审–根据需求计划书(PRD)和原型图设计测试用例;设计好后一般会召开测试用例评审,看看测试用例是否覆盖全面,如果是很简单很小一个模块的测试,就没有必要召开用例评审,把编写好的测试用例发给产品看,产品觉得用例覆盖全面了,就可以执行测试;然后测试中发现的bug会在TAPD(tapd是一个项目管理工具,说你熟悉在使用的工具即可,如禅道)指派给相应的开发人员,跟踪bug;开发人员改完bug后会流转给我,进行回归测试;测试通过的流转给产品,进行发布

4. 测试用例的设计

这种一般会出一道题让你写测试点,主要是看你的思路,从你的思路可以看出你的一个逻辑、考虑问题是否全面。因此平常多看看一些例子,想一想用例。
比如
微信发红包,你要如何测试它?
微信一对一聊天的界面,如何设计测试用例?
微信发朋友圈,说出你的测试用例?
给你一个输入框和一个结算按钮,你如何测试它?
上面的这些可以自行去百度看一看

如果不知道测试用例报告设计的童鞋可以看下这几篇
测试用例和缺陷报告(项目实例)
测试点笔试题–银行申贷款
软件测试笔试面试题

五. 计算机网络

1. HTTP和HTTPS的区别

简单的回答:
1、端口不同,HTTP端口是80,HTTPS端口是443;
2、HTTP的连接是无状态的,是明文传输、HTTPS加了一层SSL层是密文传输,因此更安全
3、资源消耗:和Http通信相比,Https通信会由于加减密处理消耗更多的CPU和内存资源;
4、开销:Https需要申请证书,而证书一般需要向认证机构购买;
然后有些面试官就会由这个问题更深入的问你,HTTPS为什么安全??
不清楚的童鞋可以看这篇HTTPS为什么安全
HTTP协议详解

2. 三次握手和四次挥手

三次握手和四次挥手常考的经典面试题,虽然我还没有被问到,但是从前辈们了解到是常问的面试题,还是要掌握的。

计算机网络的面试题可以看下这篇软件测试经典面试题集锦(一)收录了几道关于计算机网络的面试题,本篇就不再赘述了

暂时先整理出这部分,目前自己面试的也不多,后续面试被问到哪些有疏漏的或是自己不是很懂的,再来整理补充。

以上回答有疏漏的或是回答的不对的地方,恳请各位大佬指正≧◉◡◉≦

♡ \color{red}{\heartsuit}

你可能感兴趣的:(#,软件测试面试题,java,数据库,数据结构,面试)