要想找到一份好工做,筆試面試這關必須得經過。且先不說您的能力怎麼樣,有時以爲筆試面試就如同英語考試。一個「英語很好」的人,好比能夠很流利的說英語,跟老外交流,然而,讓他參加考研之類的英語考試,未必可以獲得很高的分數,由於這類題自己就很詭異,考試須要有必定的技巧才行。固然,考試仍是可以反映一我的的水平的。相似的,若是您很牛,但要找到一份好工做,好好複習一下筆試面試的知識仍是很必要的,由於不免出現一些「詭異」的題目,這些題目中的作法可能實際應用中,你永遠也見不到。今天polaris收集一些「詭異」的筆試面試題分享給你們,這些題目自己沒有多大意義,主要是明白爲何結果是這樣,明白其原理。這些題目大部分是Java語言的,若是涉及到其餘語言會特別說明。java
沒見過此題的人,大部分人可能獲得的結果是:1。 然而,運行的結果會令您完全失望。這是什麼緣由呢?原來Java編譯器處理後綴++或--時是這麼處理的:java的編譯器在遇到j++和j- -的時候會從新爲變量運算分配一塊內存空間,以存放原始的值,而在完成了賦值運算以後,將這塊內存釋放掉。即JAVA先將i的值保存到臨時內存空間中,而後處理++,即原來的j加1,此時原來的j變成1,而後再執行賦值,將內存空間中所存放的原來的值賦回給j,因此j仍然是0。C#和Java的結果是同樣的。面試
相反,C/C++不是這麼處理的:C中是經過寄存器做中轉先把j的值賦給它自己,再執行++的操做,這樣結果就是1了。ide
題目是:spa
- String a = "abc";
- String b = "abc";
- System.out.println("====>"+ a==b );
請問輸出結果是true仍是false?orm
這道題只要稍微仔細點就可以作出來。固然,我想大部分人可能都會掉入出題者的圈套中。對象
這道題目其實就是考察您是否細心以及運算符優先級。「+」的優先級高於「==」,於是打印語句先執行「+」操做,這樣實際上比較的是"====>abc"與"abc",很明顯會返回false。不過此題有一種人可能會作對,即認爲a==b返回的是false。ip
其實此題能夠改得更難點,即改成System.out.println(""+ a==b ); 固然結果仍是同樣的,只是多考察了一個知識點:"" + a 與 b是否指向同一個對象。String永遠是面試官最喜歡考的知識點。爲了加深對String的理解,polaris出了另外幾個「詭異」的關於String的題目,看您能作對幾個?點擊查看《經過六個題目完全掌握String筆試面試題》內存
這道題也許沒有那麼邪惡,並且這道題是各類Java筆試大全中均可以看到的一道題。然而,由這道題,您有沒有更深刻地考慮更多的問題。在此polaris進行一下引伸,看以下代碼:ci
- public static boolean get() {
- try {
- return false;
- } finally {
- return true;
- }
- }
請你們思考一個問題,return的具體實現是怎樣的?若是返回false,爲何;若是返回是true,又是爲何呢?給個你認爲正確答案的理由出來。get
咱們都知道,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虛擬機(第二版)》。
完成於2010/10/3 16:10,因爲polaris水平有限,若有疏忽,敬請指正。