一面:面试官问的面试题:
1、首先自我介绍,然后问了简历上熟悉的自动化测试框架的使用过程,自动化测试框架的优缺点
2、用栈实现队列
3、数据库的死锁问题
死锁:是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。
产生死锁的原因主要是:
(1)系统资源不足。
(2) 进程运行推进的顺序不合适。
(3)资源分配不当等。
如果系统资源充足,进程的资源请求都能够得到满足,死锁出现的可能性就很低,否则就会因争夺有限的资源而陷入死锁。其次,进程运行推进顺序与速度不同,也可能产生死锁。
4、三次握手,四次握手
三次握手的目的是建立可靠的通信信道,说到通讯,简单来说就是数据的发送与接收,而三次握手最主要的目的就是双方确认自己与对方的发送与接收机能正常。
第一次握手:Client什么都不能确认;Server确认了对方发送正常
第二次握手:Client确认了:自己发送、接收正常,对方发送、接收正常;Server确认了:自己接收正常,对方发送正常
第三次握手:Client确认了:自己发送、接收正常,对方发送、接收正常;Server确认了:自己发送、接收正常,对方发送接收正常
所以三次握手就能确认双发收发功能都正常,缺一不可。
为什么要四次挥手?
答:根本原因是,一方发送FIN只表示自己发完了所有要发的数据,但还允许对方继续把没发完的数据发过来。
举个例子:A和B打电话,通话即将结束后,A说“我没啥要说的了”,B回答“我知道了”,但是B可能还会有要说的话,A不能要求B跟着自己的节奏结束通话,于是B可能又巴拉巴拉说了一通,最后B说“我说完了”,A回答“知道了”,这样通话才算结束。
5、面向对象里面重写和重载的区别
多态:允许不同类的对象对同一消息做出响应。即同一操作作用于不同的对象,可以有不同的解释,产生不同的执行结果。这也意味着一个对象有着多重特征,可以在特定的情况下,表现不同的状态,从而对应着不同的属性和方法。
多态的实现方式:接口实现,继承父类进行方法重写,同一个类中进行方法重载。
方法重载(Overloading):一个类中有多个方法(函数),它们具有相同的名字,但方法传递的参数或参数的个数不同,返回类型可以相同。
方法重写(Override): 子类对父类的方法做一定的修改,返回值和形参都不能改变。又称方法覆盖。
6、父函数子函数是指什么
7、Linux命令,查看机器上所有的进程(top)
可以使用ps命令。它能显示当前运行中进程的相关信息,包括进程的PID
8、过滤出某一个生产条件对应的进程
9、某一个端口的占用情况
输入命令:netstat -ano,列出所有端口的情况。
打开任务管理器,切换到进程选项卡,在PID一列查看2720对应的进程是谁,如果看不到PID这一列,如下图:
10、介绍Linux管道
tail -200 ims.log | grep "Integer" 日志查找关键字命令
管道
举例:ls -a | grep mysql
说明:就是把前一个命令的结果当成后一个命令的输入。结合本例就是先显示所有的文件,然后再用grep命令在ls的结果中查找包含mysql的文件
11、数据库增删改查命令,分别介绍一下每个命令的作用,删除表,删除表的某一行各怎么写
插入记录:insert
更新记录:update
删除记录:delete
查询记录:select
表的创建:create tablename ..
表的查看:desc tablename
表的删除:drop table tablename
表的修改:
修改表
1)修改某个表中某个列的某个数据类型
语法:alter table tablename modify column_name newcolumn_type;
2)增加表字段 语法:alter table tablename add column newcolumn_name newcolumn_type;
3)删除表字段 语法:alter table tablename drop column column_name;
4) 字段改名 语法:alter table tablename change column_name newcolumn_name column_type;(将column_type更改,成为newcolumn_type,可同时更改字段类型)
12、你比较熟悉的设计模式有哪些
单例模式、抽象工厂模式
13、设计一个类,我们只能获取这个类的一个实例,其实是一个单例模式,可以作为参考(我写到了static)
单例模式实现步骤:
1.把构造方法私有化
2.惟一的一个实例,加上static属性
3.对外提供获取该类对象的共有方法也是static属性
14、类里面静态变量和非静态变量的区别(原题+3)
static修饰的成员,大家用的时候都用的一个东西,一个人改动后,大家的都变了。而非static 修饰的成员是个人私有的,允许自己修改,每个人的都不一样。
静态变量在内存中只有一个,java虚拟机在加载类的过程中为静态变量分配内存,静态变量位于方法区,被类的所有实例共享。而实例变量取决于类的实例。每创建一个实例,java虚拟机就会为实例变量分配一次内存,实例变量位于堆区中,其生命周期取决于实例的生命周期。
15、比较熟悉的排序有哪些,(冒泡,归并)分别介绍一下
冒泡排序:将序列中所有元素两两比较,将最大的放在最后面。将剩余序列中所有元素两两比较,将最大的放在最后面。重复第二步,直到只剩下一个数。
代码;
public class SortTest {
/*冒泡排序
*/
public static void bubbleSort(int[] a) {
int len=a.length;
for(int i=0;i<len;i++) {
for(int j=0;j<len-i-1;j++) {//第二重循环的条件
if(a[j]>a[j+1]) {
int temp=a[j];
a[j]=a[j+1];
a[j+1]=temp;
}
}
}
}
public static void main(String[] args) {
int a[]=new int[] {8,3,5,9,1};
SortTest.bubbleSort(a);
System.out.println(Arrays.toString(a));
}
}
归并排序
速度仅次于快速排序,内存少的时候使用,可以进行并行计算的时候使用。
选择相邻两个数组成一个有序序列。
选择相邻的两个有序序列组成一个有序序列。
重复第二步,直到全部组成一个有序序列。
public void mergeSort(int[] a, int left, int right) {
int t = 1;// 每组元素个数
int size = right - left + 1;
while (t < size) {
int s = t;// 本次循环每组元素个数
t = 2 * s;
int i = left;
while (i + (t - 1) < size) {
merge(a, i, i + (s - 1), i + (t - 1));
i += t;
}
if (i + (s - 1) < right)
merge(a, i, i + (s - 1), right);
}
}
private static void merge(int[] data, int p, int q, int r) {
int[] B = new int[data.length];
int s = p;
int t = q + 1;
int k = p;
while (s <= q && t <= r) {
if (data[s] <= data[t]) {
B[k] = data[s];
s++;
} else {
B[k] = data[t];
t++;
}
k++;
}
if (s == q + 1)
B[k++] = data[t++];
else
B[k++] = data[s++];
for (int i = p; i <= r; i++)
data[i] = B[i];
}
一、稳定性:
稳定:冒泡排序、插入排序、归并排序和基数排序
不稳定:选择排序、快速排序、希尔排序、堆排序
二、平均时间复杂度
O(n^2):直接插入排序,简单选择排序,冒泡排序。
参考资料:https://blog.csdn.net/u011485276/article/details/82910259