1. 程式人生 > >Java面試中遇到的坑【填坑篇】

Java面試中遇到的坑【填坑篇】

看到大家對上篇《Java面試中遇到的坑》一文表現出強力的關注度,說明大家確實在面試中遇到了類似的難題。大家在文章留言處積極留言探討面試中遇到的問題,其中幾位同學還提出了自己的見解,我感到非常高興,還有幾位同學強烈要求給出題目答案,那我很樂意跟大家一起探討分享這些題目。

我將題目答案寫下來,這個並非標準答案,有不準確的地方請大家辯證補充。

1.StringBuilder替代String拼接,面試中經常會問到String,StringBuilder,StringBuffer的區別。

解答:String類作為java語言中最常見的字串類被廣泛使用,如果在做大量字串拼接效率時變得比較低,因為虛擬機器需要不斷地將物件引用指向新的地址。因此,一般方法內的私有變數推薦使用stringBuilder來完成,如果是多執行緒需要同步的自然選用stringBuffer。

1.對引數未做空驗證,就做判斷值相等

下面的寫法將常量放到方法左邊,能防止NPE。

解答:關於這道題需要檢視String類中equals的實現方法,當左邊為Null時會出現NPE。因此後續程式碼中需要保證equals方法左邊變數不為null。

2.這個坑很多兄弟都踩過,知道為什麼

列印結果為false,而下面結果為true為啥

解答:Integer型別當正整數小於128時是在記憶體棧中建立值的,並將物件指向這個值,這樣當比較兩個棧引用時因為是同一地址引用兩者則相等。當大於127時將會呼叫new Integer(),兩個整數物件地址引用不相等了。這就是為什麼當值為128時不相等,當值為100時相等了。

3.將變數作為引數傳遞,在方法中改變引數值,變數的值改變了麼?下圖total值到底是幾?

解答:將一個私有變數作為形參傳遞賦值並不會改變引數原有的值,但是如果將一個物件作為引數傳遞改變屬性,物件的屬性值就會隨著改變。因此total的值仍然為0。

4.由陣列轉換的list,只能迴圈遍歷,而不能看長度,增加元素,刪除元素,這是為何?下圖程式碼執行竟然出錯!

解答:因為將陣列轉換的列表其實不是我們經常使用的arrayList,但只是陣列中內部定義的一種資料結構型別,本質還是原陣列而並非列表,因此當向列表新增元素就會出現錯誤,這道題上當的兄弟不少吧。

5.將列表中李明的名字移除掉,下圖實現有無問題?

解答:在列表中移除最後一個元素按說應該沒有問題的,但是這個演算法還是出現了錯誤,主要是這種寫法的列表迴圈遵循下表索引查詢,當移除某個元素時,上次計算出來的長度超過了當前列表長度,故而會出現越界錯誤。

6.在指定目錄下建立檔案目錄,到底使用哪一種呢,兩個方法都沒報錯,為何第一次沒建立目錄而第二次建立?

解答:mkdirs()可以建立多級資料夾,而mkdir()只會建立一級的資料夾。這個主要依靠java底層呼叫作業系統的實現,作者愚見無須弄明白底層實現原理,只要使用中能區分不留BUG就好。

7.老闆從客戶那裡回來後罵了我一頓,說是客戶介面顯示金額很奇怪,我的程式碼那裡有問題?

解答:這道題如果我是老闆我會打你的,因為老闆之前也寫過程式碼。老闆之所以罵你是因為客戶看到的太奇怪以至於看不懂,兩個float型別資料相減會丟失精度,尾部帶著常常的一串數字。如果實際場景要做計算我給你兩個思路:第一可以用bigdecimal來計算,第二先將單位做成整數再做除法。

8.面試官:你能說出來java中實現多執行緒的幾種方法麼?

面試者:繼承Thread類和實現runnable介面!
面試官:除此以外還有方法麼?
面試者:就這兩種實現啊?!
面試官:我們聊點別的,呵呵。

解答:這道題最有意思了,一般人都會乾脆利索回答前兩個,我工作前3年每次都是信心滿滿這樣回答問題的。其實 實現多執行緒還可以實現Callable介面,利用task來接受非同步執行緒的執行結果。希望後面再被面試官問到這道題可千萬別再入坑,並且能回答這第三種方式跟前兩種不同的地方(可以獲取執行結果)。

9.我只是想讓這個好好迴圈三次,有什麼問題麼?

解答:這道題主要是犯了整數符號位的問題了,大家可以瞭解一下

Integer.MAX_VALUE加上1以後的數值這道陷阱題就解決了。

10.這個一直沒有弄明白,到底返回哪個true還是false?

解答:這道題大家需要弄明白finally的使用場景,主要是捕獲異常以後必須要執行的程式碼,大多是關閉流之類的。即使try的程式碼塊已經返回結果但程式仍然會執行finally裡面的程式碼,因此上題返回false。

大家可以看看下面這道題返回結果是多少?歡迎留言,答對的同學自己給自己晚飯加雞腿。