一面:面試官問的面試題:
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):直接插入排序,簡單選擇排序,冒泡排序。