2015年網易校招Java開發工程師(技術架構)線上筆試題(2015年9月20日 18:00—20:00)
1、 程式和程序的本質區別是?
A、在外存和記憶體儲存
B、非順序和順序執行機器指令
C、獨佔使用和分時使用計算機資源
D、靜態和動態特徵
參考答案分析:
程序與應用程式的區別:
程序(Process)是最初定義在Unix等多使用者、多工作業系統環境下用於表示應用程式在記憶體環境中基本執行單元的概念。以Unix作業系統為例,程序是Unix作業系統環境中的基本成分、是系統資源分配的基本單位。Unix作業系統中完成的幾乎所有使用者管理和資源分配等工作都是通過作業系統對應用程式程序的控制來實現的。
C、C++、Java等語言編寫的源程式經相應的編譯器編譯成可執行檔案後,提交給計算機處理器執行。這時,處在可執行狀態中的應用程式稱為程序。從使用者角度來看,程序是應用程式的一個執行過程。從作業系統核心角度來看,程序代表的是作業系統分配的記憶體、CPU時間片等資源的基本單位,是為正在執行的程式提供的執行環境。程序與應用程式的區別
多工環境下應用程式程序的主要特點包括:
●程序在執行過程中有記憶體單元的初始入口點,並且程序存活過程中始終擁有獨立的記憶體地址空間;
●程序的生存期狀態包括建立、就緒、執行、阻塞和死亡等型別;
●從應用程式程序在執行過程中向CPU發出的執行指令形式不同,可以將程序的狀態分為使用者態和核心態。處於使用者態下的程序執行的是應用程式指令、處於核心態下的應用程式程序執行的是作業系統指令。
在Unix作業系統啟動過程中,系統自動建立swapper、init等系統程序,用於管理記憶體資源以及對使用者程序進行排程等。在Unix環境下無論是由作業系統建立的程序還要由應用程式執行建立的程序,均擁有唯一的程序標識(PID)
2、 假設某演算法的時間複雜度符合遞推關係式T(n)=2T(n/2)+n,那麼該演算法的時間複雜度相當於
A、O(n)
B、O(lgn)
C、O(nlgn)
D、O(n2)
參考答案分析:
解析:由時間代價嚴格推出時間複雜度比較複雜,對於這種題,可用特例驗證,不過需要注意的是特例不能取太少,至少n取到5,這樣規律基本就可以確定了。
T(1)=1
T(2)=2T(1)+2=4
T(3)=2T(1)+3=5
T(4)=2T(2)+4=12
T(5)=2T(2)+5=13
很容易排除D選項,其遞增速率介於O(n)和O(n2)之間,實際上可以參考歸併排序的遞推公式。
3、 下圖一個非確定有限自動機(NFA)的狀態轉換,其等價的正規式為()
A、0*|(0|1)0
B、(0|10)*
C、0*((0|1)0)*
D、0*(10)*
參考答案分析:
根據分析題目中給出的狀態轉換圖可知,該NFA可識別空串以及任意數目0組成的串,但若出現1,則其後至少要有1個0才能到達終態,因此,該自動機識別的串等價於正規式(0|10)*。
擴充套件閱讀:
有限自動機(FiniteAutomata)
有限自動機(DeterministicFA)
非確定有限自動機(NondeterministicFA)
詞法分析器的工作過程(參考閱讀):
參考網址:
4、 IPv6地址佔____個位元組
A、4
B、6
C、8
D、16
參考答案分析:
IPv4採用32位地址長度,約有43億地址,IPv6地址為128位長,但通常寫作8組,每組為四個十六進位制數的形式。例如:FE80:0000:0000:0000:AAAA:0000:00C2:0002 是一個合法的IPv6地址。
IPv4映像地址佈局如下:
| 80bits |16 | 32bits |
0000....................0000 | FFFF | IPv4 address |
IPv4相容地址寫法如下:::192.168.89.9
如同IPv4映像地址,這個地址仍然是一個IPv6地址,只是0000:0000:0000:0000:0000:0000:c0a8:5909的另外一種寫法罷了
5、 以下關於RARP協議的說法中,正確的是()?
A、RARP協議根據主機IP地址查詢對應的MAC地址
B、RARP協議用於對IP協議進行差錯控制
C、RARP協議根據MAC地址求主機對應的IP地址
D、RARP協議根據交換的路由資訊動態改變路由表
參考答案分析:
逆地址解析協議(Reverse Address Resolution Protocol,RARP),是一種網路協議,網際網路工程任務組(IETF)在RFC903中描述了RARP[1]。RARP使用與ARP相同的報頭結構,作用與ARP相反。RARP用於將MAC地址轉換為IP地址。其因為較限於IP地址的運用以及其他的一些缺點,因此漸為更新的BOOTP或DHCP所取代。
RARP的工作原理:
1. 傳送主機發送一個本地的RARP廣播,在此廣播包中,宣告自己的MAC地址並且請求任何收到此請求的RARP伺服器分配一個IP地址;
2. 本地網段上的RARP伺服器收到此請求後,檢查其RARP列表,查詢該MAC地址對應的IP地址;
3. 如果存在,RARP伺服器就給源主機發送一個響應資料包並將此IP地址提供給對方主機使用;
4. 如果不存在,RARP伺服器對此不做任何的響應;
5. 源主機收到從RARP伺服器的響應資訊,就利用得到的IP地址進行通訊;如果一直沒有收到RARP伺服器的響應資訊,表示初始化失敗
參考文獻:
6、 一棟大樓共及200層,某種型別的雞蛋從某一樓層及其以上樓層下來時會被打破,從該樓層(即臨界樓層)以下樓層摔下該雞蛋,雞蛋不會出現破損。現在給你2個完全一樣的該種類型的雞蛋,問:如何通過這2個雞蛋找到該臨界樓層?
參考答案分析:(智慧題_假設只有100層_樓層的層數隨意_思想關鍵_用演算法解決分析實際問題)
假設我們從第2個樓層開始試探,往樓層號碼漸次增長的方向,每隔數個樓層,試探一次,並在試探到第1個雞蛋摔破的地方停下來,用第2個雞蛋來從最近一次試探沒有摔破的樓層之上的那個樓層開始逐個樓層進行試探,知道雞蛋被摔破,我們就得到了臨界樓層,如果雞蛋一直沒有被摔破,那麼第一個雞蛋摔破的樓層就是臨界樓層。現在假設第2個樓層和下一次試探的樓層之間有x個樓層,即第2次試探的樓層號是A(2)=x+3,以後試探的樓層間隔分別減少1,那麼我們第3次試探的樓層號為A(3)=2x+3,第4次為A(4)=3x+2,第5次為A(5)=4x,第n次為A(n)=(n-1)*x-(1/2)*n*n+(5/2)*n,這裡需要注意,我們試探的n不能超過x+1,可以這麼想來:跳躍測試的n不應超過第一次最大的跨度(也即第一種需要連續測試的區間大小),及n<=x+1。那麼把x替換為n-1,得到A(n)=(1/2)*n*(n+1)+1。樓層為100,那麼A(n)=(1/2)*n*(n+1)+1>=100,得到n(n+1)>=198,得n=14,x=13,那麼A(n)=(31*n-n*n-26)/2. 即通過樓層2,16,29,41,52,62,71,79,86,92,97,101,(104,106).作為間隔就可以在使用2個雞蛋,不超過14次測試的情況下找到臨界樓層。
7、 請描述JAVA異常類的繼承體系結構,以及JAVA異常的分類,併為每種型別的異常各舉三個例子?
粉紅色的是受檢查的異常(checked exceptions),其必須被try{}catch語句塊所捕獲,或者在方法簽名裡通過throws子句宣告.受檢查的異常必須在編譯時被捕捉處理,命名為 CHeckedException 是因為Java編譯器要進行檢查,Java虛擬機器也要進行檢查,以確保這個規則得到遵守。
綠色的異常是執行時異常(runtime exceptions),需要程式設計師自己分析程式碼決定是否捕獲和處理,比如 空指標,被0除...
而宣告為Error的,則屬於嚴重錯誤,需要根據業務資訊進行特殊處理,Error不需要捕捉。
比如:AWTError、ThreadDeath、
參考網址:
8、 描述Java類載入器的原理及其組織結構?
jvm classLoader architecture :
a、Bootstrap ClassLoader/啟動類載入器
主要負責jdk_home/lib目錄下的核心 api 或 -Xbootclasspath 選項指定的jar包裝入工作.
B、Extension ClassLoader/擴充套件類載入器
主要負責jdk_home/lib/ext目錄下的jar包或 -Djava.ext.dirs 指定目錄下的jar包裝入工作
C、System ClassLoader/系統類載入器
主要負責java -classpath/-Djava.class.path所指的目錄下的類與jar包裝入工作.
B、 User Custom ClassLoader/使用者自定義類載入器(java.lang.ClassLoader的子類)
在程式執行期間, 通過java.lang.ClassLoader的子類動態載入class檔案, 體現java動態實時類裝入特性.
9、 在Web開發中,如何實現會話的跟蹤?
參考答案分析:(分為三種:SSH會話、Cookies、URL重定向)
A、SSL會話(Secure Socket Layer)
安全套接字層,是一種執行在TCP/IP之上和像HTTP這種應用層協議之下的加密技術。SSL是在HTTPS協議中使用的加密技術。SSL可以讓採用SSL的伺服器認證採用SSL的客戶端,並且在客戶端和伺服器之間保持一種加密了連線,在建立了加密連線的過程中,客戶端和伺服器都可以產生一種名為“會話金鑰”的東西,它是一種用於加密和解密的對稱金鑰。基於HTTPS協議的伺服器可以使用這個客戶端的對稱金鑰來建立會話
B、Cookies
中文譯為小甜餅,由Netscape公司發明,是最常用的跟蹤使用者會話的方式。Cookies是一種由伺服器傳送給客戶端的片段資訊,儲存在客戶端的記憶體或者硬碟上,在客戶隨後對該伺服器的請求中發回它。其實主要就是把伺服器為客戶端分配的session ID儲存在Cookies中,每次傳送請求時把Cookies附加到請求物件中一起發過去,伺服器得到這個唯一的session ID,從而可以唯一的標識一個客戶端
3、URL重寫
如果客戶端禁用了Cookies,那麼就只能用URL重寫機制了。就是在URL中附加標識客戶端的sessionID,web容器解析URL,取出session ID,根據這個session ID將請求與特定的session關聯起來。
注意如果採用了URL重寫,那麼程式碼裡面的所有url都要經過編碼,response.sendRedirect(url)中的url用response.encodeRedirectURL(url)編碼,其他的用response.encodeURL(url)來編碼
10、 請簡述Spring架構中IOC的實現原理?
參考文獻閱讀:(怎樣自己寫一個Spring)
11、 檢查程式,是否存在問題,如果存在指出問題所在,如果不存在,說明輸出結果。
package algorithms.com.guan.javajicu;
public class TestDemo {
public static String output ="";
public static void foo(inti){
try{
if(i == 1){
throw new Exception();
}
}catch(Exception e){
output += "2";
return ;
}finally{
output += "3";
}
output += "4";
}
public static void main(String[] args) {
foo(0);
foo(1);
System.out.println(output); //3423
}
}
考點分析:
12、 檢查程式,是否存在問題,如果存在指出問題所在,如果不存在,說明輸出結果。
package algorithms.com.guan.javajicu;
public class HelloB extends HelloA{
public HelloB(){
System.out.println("HelloB");
}
{
System.out.println("I'm B class");
}
static{
System.out.println("static B");
}
public static void main(String[] args) {
new HelloB();
/**輸出結果參考答案:
* static A
staticB
I'mA class
HelloA
I'mB class
HelloB
*/
}
}
class HelloA{
public HelloA(){
System.out.println("HelloA");
}
{
System.out.println("I'm A class"); //這句話是什麼時候載入?
}
static{
System.out.println("static A");
}
}
考點分析:
13、 檢查程式,是否存在問題,如果存在指出問題所在,如果不存在,說明輸出結果。
package algorithms.com.guan.javajicu;
public class Inc {
public static void main(String[] args) {
Incinc = new Inc();
int i = 0;
inc.fermin(i);
i= i ++;
System.out.println(i); //輸出結果為0
}
void fermin(int i){
i++;
}
}
考點分析:
14、 檢查程式,是否存在問題,如果存在指出問題所在,如果不存在,說明輸出結果。
package algorithms.com.guan.javajicu;
public class Example {
Stringstr = new String("good");
char[] ch = {'a','b','c'};
public static void main(String[] args) {
Exampleex = new Example();
ex.change(ex.str, ex.ch);
System.out.print(ex.str +"and");
System.out.print(ex.ch);
//參考答案輸出結果:goodandgbc
}
public void change(Stringstr, char ch[]){
str= "test ok";
ch[0]= 'g';
}
}
考點分析:
15、 檢查程式,是否存在問題,如果存在指出問題所在,如果不存在,說明輸出結果。
packagealgorithms.com.guan.javajicu;
import java.util.Date;
public class SuperTest extends Date{
private static final long serialVersionUID = 1L;
private void test(){
System.out.println(super.getClass().getName());
//參考答案輸出:algorithms.com.guan.javajicu.SuperTest
}
public static void main(String[]args){
newSuperTest().test();
}
}
考點分析:
16、 任意2n個整數,從其中選出n個整數,使得選出的n個整數和同剩下的n個整數之和的差最小。
註解:這三個程式有空再貼上程式碼
17、 有兩個有序的集合,集合的每個元素都是一段範圍,求其交集,例如集合{[4,8],[9,13]}和{[6,12]}的交集為{[6,8],[9,12]}
可供參考的文獻:
18、 一個檔案中有10000個數,用Java實現一個多執行緒程式將這個10000個數輸出到5個不用檔案中(不要求輸出到每個檔案中的數量相同)。要求啟動10個執行緒,兩兩一組,分為5組。每組兩個執行緒分別將檔案中的奇數和偶數輸出到該組對應的一個檔案中,需要偶數執行緒每列印10個偶數以後,就將奇數執行緒列印10個奇數,如此交替進行。同時需要記錄輸出進度,每完成1000個數就在控制檯中列印當前完成數量,並在所有執行緒結束後,在控制檯列印”Done”.
可供參考的文獻:
/資料探勘工程師筆試題目(筆試時間:2014-9-20,天津站)