收集各種詭異的筆試面試題
要想找到一份好工作,筆試面試這關必須得通過。且先不說您的能力怎么樣,有時覺得筆試面試就如同英語考試。一個“英語很好”的人,比如可以很流利的說英語,跟老外交流,然而,讓他參加考研之類的英語考試,未必能夠得到很高的分數,因為這類題本身就很詭異,考試需要有一定的技巧才行。當然,考試還是能夠反映一個人的水平的。類似的,如果您很牛,但要找到一份好工作,好好復習一下筆試面試的知識還是很必要的,因為難免出現一些“詭異”的題目,這些題目中的做法可能實際應用中,你永遠也見不到。今天polaris收集一些“詭異”的筆試面試題分享給大家,這些題目本身沒有多大意義,主要是明白為什么結果是這樣,明白其原理。這些題目大部分是Java語言的,如果涉及到其他語言會特別說明。
1、int j = 0;j = j++;問j現在等于多少?
沒見過此題的人,大部分人可能得到的結果是:1。 然而,運行的結果會令您徹底失望。這是什么原因呢?原來Java編譯器處理后綴++或--時是這么處理的:java的編譯器在遇到j++和j- -的時候會重新為變量運算分配一塊內存空間,以存放原始的值,而在完成了賦值運算之后,將這塊內存釋放掉。即JAVA先將i的值保存到臨時內存空間中,然后處理++,即原來的j加1,此時原來的j變成1,然后再執行賦值,將內存空間中所存放的原來的值賦回給j,所以j仍然是0。C#和Java的結果是一樣的。
相反,C/C++不是這么處理的:C中是通過寄存器作中轉先把j的值賦給它本身,再執行++的操作,這樣結果就是1了。
2、一道邪惡的 Java基礎題——來自JavaEye的網友
題目是:
String b = "abc";
System.out.println("====>"+ a==b );
請問輸出結果是true還是false?
這道題只要稍微仔細點就能夠做出來。當然,我想大部分人可能都會掉入出題者的圈套中。
這道題目其實就是考察您是否細心以及運算符優先級。“+”的優先級高于“==”,因而打印語句先執行“+”操作,這樣實際上比較的是"====>abc"與"abc",很明顯會返回false。不過此題有一種人可能會做對,即認為a==b返回的是false。
其實此題可以改得更難點,即改為System.out.println(""+ a==b ); 當然結果還是一樣的,只是多考察了一個知識點:"" + a 與 b是否指向同一個對象。String永遠是面試官最喜歡考的知識點。為了加深對String的理解,polaris出了另外幾個“詭異”的關于String的題目,看您能做對幾個?點擊查看《通過六個題目徹底掌握String筆試面試題》
3、try中包含 return語句,finally是否還執行,在return之前還是之后?
這道題也許沒有那么邪惡,而且這道題是各種Java筆試大全中都可以看到的一道題。然而,由這道題,您有沒有更深入地考慮更多的問題。在此polaris進行一下引申,看如下代碼:
try {
return false;
} finally {
return true;
}
}
請大家思考一個問題,return的具體實現是怎樣的?如果返回false,為什么;如果返回是true,又是為什么呢?給個你認為正確答案的理由出來。
我們都知道,try中包含return語句,finally仍然會執行,且在return之前執行(其實,對這個答案polaris不是很贊同,就像JavaEye上有人詳細分析一道題:構造了幾個String對象一樣。polaris覺得出這樣的題目也是很沒有水準的)。如果答案是在return之前執行,那為什么上面的代碼返回結果卻是true,如何解釋?
這道題目本身沒有什么意義,題目本身不是很嚴謹,對finally語句中是什么內容沒有說明,內容不一樣,答案會不一樣。return語句執行做了什么?如果finally中的語句包含break;continue等又會是什么樣的結果?
根據《JVM Specification 3.0》的4.9.6節,在try中的return真正返回之前,會將false保存到一個臨時變量(假設為var)中,然后執行finally,在執行finally子句的任何語句之前,會將var中的值取出,如果finally中沒有拋出異常或return、break、continue等語句,則在finally執行完后返回var(相當于返回去完成try中return的執行),如果finally中有return,var值會被覆蓋,返回結果是finllay子句中return的值,如果是異常或break、continue等則執行相應的操作而不是返回。更詳細解釋參考JVM規范或《深入理解JAVA虛擬機(第二版)》。