这些棘手的Java面试题,答案你都知道吗?
轉載自??這些棘手的Java面試題,答案你都知道嗎?
棘手的Java面試問題是那些有一些驚喜元素的問題。如果你試圖用常識回答一個棘手的問題,你很可能會因為需要一些特定的知識而失敗。大多數棘手的Java問題來自于令人困惑的概念,如函數重載和覆蓋,多線程,掌握非常棘手,字符編碼,檢查與未檢查的異常和Integer溢出等微妙的Java編程細節。
回答棘手的Java問題最重要的是態度和分析思維,即使你不知道答案也會有所幫助。在這篇Java文章中,我們將看到下面幾個Java問題,并且需要更多的Java編程語言知識來正確回答它們。
1、以下Java程序打印了什么?
public?class?Test?{?public?static?void?main(String[]?args){System.out.println(Math.min(Double.MIN_VALUE,?0.0d));?}? }不像整數,其中MINVALUE為負,Double的MAXVALUE和MIN_VALUE都是正數。Double.MINVALUE是2 ^( - 1074) ,Double常數,其大小是所有的Double值當中最小。因此,與明顯的答案不同,此程序將打印0.0,因為Double.MINVALUE大于0.向Java開發人員提出了這個問題,他們有3至5年的經驗,令人驚訝的是,近70%的候選人錯了。
?
2、如果在try或catch塊上放置return語句或System.exit()會發生什么?最后會阻止執行嗎?
這是一個非常流行的棘手的Java問題,它很棘手,因為許多程序員認為無論如何,但finally塊將始終執行。這個問題通過在try或catch塊中放置一個return語句或從try或catch塊調用System.exit()來挑戰該概念。在Java中回答這個棘手的問題是,即使你在try塊或catch塊中放入一個return語句,finally塊也會執行,但是如果你從try或catch塊調用System.exit(),最后塊將無法運行。
?
3、您可以在Java中覆蓋私有或靜態方法嗎?
如果要在Java中提出技巧問題,方法覆蓋是一個很好的主題。無論如何,你不能在Java中覆蓋私有或靜態方法,如果你在子類中創建一個具有相同返回類型和相同方法參數的類似方法,那么它將隱藏超類方法,這稱為方法隱藏。
類似地,您不能覆蓋子類中的私有方法,因為它在那里不可訪問,您要做的是在子類中創建另一個具有相同名稱的私有方法。
?
4、表達式1.0 / 0.0將返回什么?它會拋出異常嗎?任何編譯時錯誤?
雖然Java開發人員知道雙原語類型和Double類,但在進行浮點運算時,他們沒有足夠重視Double.INFINITY,NaN和-0.0以及其他規則來控制涉及它們的算術計算。這個問題的簡單答案是它不會拋出ArithmeticExcpetion并返回Double.INFINITY。
另外,請注意,即使x本身是NaN,比較x == Double.NaN也始終求值為false。要測試x是否為NaN,應該使用方法調用Double.isNaN(x)檢查給定的數字是否為NaN。如果您了解SQL,那么非常接近NULL。
?
5、Java是否支持多重繼承?
如果C ++可以支持直接的多重繼承,那么為什么Java不是Interviewer經常給出的參數。這個問題的答案比它看起來更加微妙,因為Java通過允許接口擴展其他接口來支持Type的多個繼承,Java不支持的是多個實現繼承。由于現在Java 8的默認方法提供了Java也存在多種行為繼承,因此這種區別也變得模糊。
?
6、如果我們將一個關鍵對象放在已經存在的HashMap中會發生什么?
HashMap如何在Java中運行。HashMap也是一個在Java中創建令人困惑和棘手的問題的熱門話題。這個問題的答案是,如果你再次使用相同的密鑰,那么它將替換舊的映射,因為HashMap不允許重復密鑰。相同的密鑰將產生相同的哈希碼,并最終將在桶中的相同位置。
每個存儲桶都包含一個Map.Entry對象的鏈接列表,其中包含Key和Value。現在,Java將從每個條目中獲取Key對象,并使用equals()方法與此新鍵進行比較,如果返回true,則該條目中的value對象將被新值替換。
?
7、以下Java程序打印了什么?
public?class?Test?{?public?static?void?main(String[]?args)?throws?Exception?{?char[]?chars?=?new?char[]?{'\u0097'};?String?str?=?new?String(chars);byte[]?bytes?=?str.getBytes();?System.out.println(Arrays.toString(bytes));?}? }這個問題的要點在于字符編碼以及字符串到字節數組轉換的工作原理。在這個程序中,我們首先從一個字符數組創建一個String,它只有一個字符'\ u0097',之后我們從該String獲取字節數組并打印該字節。由于\ u0097在字節基本類型的8位范圍內,因此猜測str.getBytes()調用將返回包含一個值為-105 ((byte)0x97)的元素的字節數組是合理的。
然而,這不是程序打印的,這就是為什么這個問題很棘手。事實上,程序的輸出是依賴于操作系統和語言環境的。在具有美國語言環境的Windows XP上,上述程序打印[63],如果在Linux或Solaris上運行此程序,則會得到不同的值。
要正確回答這個問題,您需要了解Unicode字符在Java字符串值和Java字符串中的表示方式,以及字符編碼在String.getBytes()中的作用。
簡單來說,將字符串轉換為字節數組,Java遍歷字符串表示的所有字符,并將每個字符轉換為多個字節,最后將字節放在一起。將每個Unicode字符映射到字節數組的規則稱為字符編碼。因此,如果在編碼和解碼期間不使用相同的字符編碼,則檢索到的值可能不正確。當我們調用 str.getBytes() 而不指定字符編碼方案時,JVM使用平臺的默認字符編碼來完成工作。
默認編碼方案是操作系統和區域設置相關。在Linux上,它是UTF-8,在Windows上具有美國語言環境,默認編碼為Cp1252。這解釋了我們在具有美國語言環境的Windows機器上運行此程序所獲得的輸出。無論使用哪種字符編碼方案,Java總是將編碼未識別的Unicode字符轉換為63,這表示所有編碼中的字符U + 003F。
?
8、以下在Java中實現compareTo()方法有什么問題
public?int?compareTo(Object?o){?Employee?emp?=?(Employee)?o;?return?this.id?-?e.id;?}其中id是整數。 好吧,在你保證id總是正面之前,這個Java問題中的三個沒有錯。當你無法保證id為正或負時,這個Java問題變得棘手。棘手的部分是,如果id變為負數,則減法可能會溢出并產生不正確的結果。
?
9、你如何確保N線程可以在沒有死鎖的情況下訪問N個資源?
如果您不熟悉編寫多線程代碼,那么這對您來說是一個非常棘手的問題。即使對于沒有真正面臨死鎖和競爭條件的經驗豐富的高級程序員來說,這個Java問題也很棘手。這里的關鍵點是排序,如果您按特定順序獲取資源并以相反的順序釋放資源,則可以防止死鎖。
考慮以下Java代碼片段,它初始化兩個變量并且兩者都不是易失性的,并且兩個線程T1和T2正在修改這些值,如下所示,兩者都不同步
int?x?=?0;? boolean?bExit?=?false;?Thread?1?(not?synchronized)? x?=?1;? bExit?=?true;?Thread?2?(not?synchronized)? if?(bExit?==?true)? System.out.println("x="?+?x);這個問題的答案是肯定的,線程T2可能會打印x = 0.為什么?因為沒有對編譯器的任何指令,例如synchronized或volatile, bExit = true 可能在編譯器重新排序中在x = 1之前出現。此外,x = 1可能在線程2中不可見,因此線程2將加載x = 0。現在,你如何解決它?
向幾個程序員提出這個問題時,他們的回答不同,一個人建議讓兩個線程在一個共同的互斥鎖上同步,另一個人說這兩個變量都是易變的。兩者都是正確的,因為它會阻止重新排序并保證可見性。
但最好的答案是你只需要使 bExit 成為易失性,然后線程2只能打印“x = 1”。x不需要是volatile,因為 當bExit 是volatile 時, 不能在bExit = true之后重新排序x 。
總結
以上是生活随笔為你收集整理的这些棘手的Java面试题,答案你都知道吗?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ps4电脑配置要求(ps4 电脑配置)
- 下一篇: java美元兑换,(Java实现) 美元