0 簡述
筆試時間90分鐘,線上筆試,範圍較廣,那天剛考完一科,晚上就做這個筆試題。之前我並沒有複習,而且關鍵我比較菜,所以並沒有過。
整個測試包括20道不定項選擇題,2道在線編程題,1道論述題。並且題目只能順序作答,不支持跳題或返回上一題,不可跳出答題界面5次以上。
1 不定項選擇題
1.1 在OSI參考模型中,保證端-端的可靠性是在( )完成的?
網絡層
數據鏈路層
會話層
傳輸層
**參考答案:傳輸層。**OSI,Open System Interconnection,開放系統互聯模型。包括七層:
physical-物理層(二進制傳輸)
data link-數據鏈路層(訪問介質)
network-網絡層(數據傳輸)
transport-傳輸層(端到端連接)
session-會話層(主機間通信)
presentation-表示層(數據表示)
application-應用層(網絡進程訪問應用層)
1.2 下列哪個HTTP頭部用於包含斷點續傳信息?
Cookie
Connection
Content-Type
Content-Range
**參考答案:Content-Range。**HTTP斷點續傳(分塊傳輸):指的是在上傳/下載時,將任務(一個文件或壓縮包)人爲的劃分爲幾個部分,每一個部分採用一個線程進行上傳/下載,如果碰到網絡故障,可以從已經上傳/下載的部分開始繼續上傳/下載未完成的部分,而沒必要從頭開始上傳/下載。可以節省時間,提高速度。
1.3 小明在程序中引入了兩個事務,同時對數據庫中同一數據進行操作,請你分析下會引起的衝突是()
A.一個是SELECT,另一個是UPDATE
B.其中有一個是DELETE
C.兩個都是SELECT
D.兩個都是UPDATE
**參考答案:ABD。**不解釋。
1.4 以下選項中,那些是Java8的新特性()
A.加入Fork/Join框架
B.在switch語句中使用字符串
C.Lambda表達式
D.新添加的Stream API(java.util.stream)把真正的函數式編程風格引入到Java中
**參考答案:CD。**AB都是java7新特性。
1.5 下列選項中關於Java引用的說法不正確的是
A.在下次GC時,虛引用指向的對象一定會被回收
B.Java中僅有弱引用、軟引用、虛引用三種類型
C.在下次GC時,軟引用指向的對象一定會被回收
D.在下次GC時,弱引用指向的對象一定會被回收
**參考答案:ABC。**GC即爲Garbage Collection,垃圾收集。B:Java有四種引用,包括強引用、軟引用、弱引用、虛引用。強引用指向的對象從來不會被回收,軟引用在內存不足時回收,弱引用在垃圾回收時被回收,虛引用在任何時候都可能被回收。
1.6 中序遍歷一個非空二叉樹,遍歷順序根節點左邊
A.只有左子樹上的部分結點
B.只有左子樹上的所有結點
C.只有右子樹上的所有結點
D.只有右子樹上的部分結點
**參考答案:B。**不解釋。
1.7 關於類加載的順序,以下說法正確的是()
A.加載->初始化->鏈接->使用->卸載
B.加載->鏈接->初始化->使用->卸載
C.以上說法都不正確
D.初始化->鏈接->加載->使用->卸載
**參考答案:A。**不解釋。
1.8 下列關於IP地址的說法中錯誤的是
A.地址205.106.256.36是一個合法的IP地址
B.IP地址一般用點分十進制表示
C.一個IP地址只能標識網絡中的唯一的一臺計算機
D.同一個網絡中不能有兩臺計算機的IP地址相同
**參考答案:A。**不解釋。
1.9 下面有關JVM,說法正確的是
A.堆用來存放對象的實例和數組,是垃圾收集器管理的主要區域,所有線程共享
B.一個對象實例有多個引用,將其中一個引用置爲null,則該對象會被回收
C.程序計數器是一個比較小的內存區域,用於指示當前線程所執行的字節碼執行到了第幾行,是線程隔離的
D.方法區用於存儲JVM加載的類信息,常量,靜態變量,以及編譯器編譯後的代碼等數據,是線程隔離的
**參考答案:AC。**不解釋。
1.10關於Java泛型以下描述正確的是
A.泛型可以消除強類型轉換,且代碼更加可讀,減少了出錯率
B.泛型可以提高Java程序的類型安全,在編譯期可以檢查因爲Java類型不正確導致的ClassCastException異常
C.泛型在編譯期就固定的類型的範圍,大量使用可以極大提高程序的運行性能
D.泛型類型除了支持對象類型,還支持數組類型以及基本數據類型
**參考答案:AB。**C:編譯器會創建類型轉換,反而會影響性能。D:泛型不支持數組及基本數據類型,虛擬機在編譯時會把帶泛型的轉換成Object類型,而基本數據類型不屬於Object 所以不能裝。Java中不允許直接創建泛型數組。
1.11 以下關於線性結構描述正確的是哪些()
A.線性結構就是順序存儲結構
B.線性結構一定有唯一的第一個元素和唯一的最後一個元素
C.隊列是線性結構,樹不是線性結構
D.線性結構擁有隨機訪問元素的特性
**參考答案:BC。**線性結構中的“線性”是指數學中的線性,即一對一的關係。B選項正確,是線性結構的基本特性之二。
1.12 關於Java的動態代理機制,正確的是()
A.Proxy接口的invoke方法可以用來動態覆蓋代理真實對象的操作
B.動態代理都是基於反射API實現的
C.每個動態代理類不是必須實現InvocationHandler接口,將實例關聯到任意一個Handler就可以
D.動態代理允許我們在代理真實對象前後添加一些自己的操作
**參考答案:AD。**B:主要是基於反射API實現的,cglib 動態代理:基於 ASM 機制實現。C:每一個動態代理類都必須要實現InvocationHandler這個接口,並且每個代理類的實例都關聯到了一個handler,當我們通過代理對象調用一個方法的時候,這個方法的調用就會被轉發爲由InvocationHandler這個接口的 invoke 方法來進行調用。
1.13 一組記錄的關鍵嗎爲(79 56 46 38 40),得到的最終排序序列的變化過程爲:
(1)79 56 46 38 40
(2)38 56 46 79 40
(3)38 40 79 46 56
(4)38 40 46 79 56
(5)38 40 46 56 79
則使用的排序方法爲()
選擇排序
快速排序
冒泡排序
插入排序
答案應該是:選擇排序。此題有爭議。
1.14 Java中以下常見的Map中有序的是()
A.HashMap
B.Hashtable
C.TreeMap
D.LinkedHashMap
參考答案:CD。
1.15 關於IO流下列描述正確的是:
A.字節流繼承自InputSteamReader或OutputStreamWriter
B.字符流繼承自InputStream或OutputStream
C.字符流繼承自InputSteamReader或OutputStreamWriter
D.字節流繼承自InputStream或OutputStream
**參考答案:CD。**不解釋,以上選項是原文。
1.16 以下說法正確的是:
A.B-樹的階數越小,越不容易發生分裂
B.B-樹的階數越大,越不容易發生分裂
C.B-樹的階數越大,越容易發生分裂
D.B-樹的階數越小,越容易發生分裂
參考答案:BD。
1.17 關於Java中的Lock,以下說法正確的是()
A.ReentrantReadWriteLock包含讀鎖和寫鎖,兩者互不干擾
B.使用tryLock()方法時,如果資源被佔用,會一直等待,直到資源釋放
C.使用lockInterruptibly()方法時,如果資源被佔用,會一直等待,直到資源釋放或者調用interrupt()方法來中斷等待
D.使用lock()方法加鎖後,必須調用unlock()方法才能釋放鎖
**參考答案:CD。**A:兩者不是互不干擾。B:不會等待,直接返回。
1.18 下面關於Java字符串的描述正確的是()
A.System.out.format("%s|%s",1,2,3)編譯通過,且輸出1|2
B.StringBuilder是線程不安全的,它比String快
C.語句System.out.println(new A())能正常運行,其中類A如下
public class A{
@Override
public String toString(){
return "hello"+this.toString();
}
}
D.StringBuffer是線程安全的,它比String快
**參考答案:AB。**C:報棧溢出錯誤
1.19 以下對Java的垃圾回收的描述,正確的是()
A.複製算法比較適合於新生代,標記階段和複製階段可以同時進行,但可一次性分配的最大內存縮小了一半
B.所有新創建的對象都會被放在年輕代,經歷N次回收仍存活就會被放到年老代
C.標記/清除算法爲了解決引用計數法的問題而提出,但是標記清除後會產生大量不連續的內存碎片
D.標記/整理算法解決了標記/清除算法的內存碎片問題,且性能更好回收速度更快
**參考答案:ABC。**D:整理需要花費不少時間,速度比標記/清除算法要慢。
1.20 在查詢語句的where子句中,如果出現了“amount between 100 and 300” 這個表達式等同於()
A. not (amount < 100 or amount > 300)
B. amount in (100,300)
C. amount >= 100 and amount <= 300
D. amount > 100 and amount < 300
參考答案:AC。
2 在線編程
2.1 字母轉換
將大寫字母轉化爲數字,“A”表示1,“AB”表示28,升序排列。
樣例輸入:
[“A”,“ZY”,“B”,“AB”]
樣例輸出:
[1,2,28,701]
方法定義如下:
//請完成以下方法
public static Integer[] listLineNumber(String[] lineTitleArr){
}
水題
public static Integer[] listLineNumber(String[] lineTitleArr){
Character[] nums = {'0','A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'};
List<Character> list = Arrays.asList(nums);
if (lineTitleArr.length < 1){
return null;
}
Integer[] result = new Integer[lineTitleArr.length];
for (int i = 0; i < lineTitleArr.length; i++) {
char[] lineTile = lineTitleArr[i].toCharArray();
int len = lineTitleArr[i].length();
Integer lineNum = 0;
for (int j = len-1; j >= 0 ; j--) {
int base = 1;
for (int k = 0; k < len-1-j; k++) {
base *= 26;
}
lineNum += list.indexOf(lineTile[j])*base;
}
result[i] = lineNum;
}
Arrays.sort(result);
return result;
}
2.2 連續非空子數組各自和的最大值最小化問題
給定一個長度爲n的整數組,數組元素均大於等於0,和一個整數m,將這個數組分成m個非空的連續子數組。設計一個算法使得這m個子數組各自和的最大值最小。
int findMinSumOfSubarray(int[] nums,int m){
//添加實現
}
輸入:
nums = [7,2,5,10,8]
m = 2
輸出:
18
解釋:
一共有四種方法將nums分割爲2個子數組。其中最好的方式是將其分爲[7,2,5]和[10,8],因爲此時這兩個子數組各自的和的最大值爲18,在所有情況中最小。
這道題有難度,筆者暫未實現。
3 論述題
爲了保證某廠各個系統的數據質量,需要設計一個數據監控平臺,該平臺的異常告警模塊,有以下需求:
- 1)觸發告警時,需要支持不同的通知方式(SMS、EMAIL、WECHAT等等)
- 2)觸發告警時,需要支持觸發事件回調,調用相關係統的接口,並能保證多個系統同時回調場景
如果是你,會如何設計這一模塊?除了考慮基本功能的實現以外,還需要考慮通知方式的擴展和回調方式的擴展,後續問題排查以及數據統計方面的需要。
請簡述你的設計要點及原因。