天天看點

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

//本文将收錄到公衆号菜單欄:《面試官來了》專欄中

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

我将題目答案寫下來,這個并非标準答案,有不準确的地方請大家辯證補充。

1.StringBuilder替代String拼接,面試中經常會問到

String,StringBuilder,StringBuffer的差別。

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

解答:String類作為java語言中最常見的字元串類被廣泛使用,如果在做大量字元串拼接效率時變得比較低,因為虛拟機需要不斷地将對象引用指向新的位址。是以,一般方法内的私有變量推薦使用stringBuilder來完成,如果是多線程需要同步的自然選用stringBuffer。

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

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

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

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

解答:關于這道題需要檢視String類中equals的實作方法,當左邊為Null時會出現NPE。是以後續代碼中需要保證equals方法左邊變量不為null。

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

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

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

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

解答:Integer類型當正整數小于128時是在記憶體棧中建立值的,并将對象指向這個值,這樣當比較兩個棧引用時因為是同一位址引用兩者則相等。當大于127時将會調用new Integer(),兩個整數對象位址引用不相等了。這就是為什麼當值為128時不相等,當值為100時相等了。

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

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

解答:将一個私有變量作為形參傳遞指派并不會改變參數原有的值,但是如果将一個對象作為參數傳遞改變屬性,對象的屬性值就會随着改變。是以total的值仍然為0。

4.由數組轉換的list,隻能循環周遊,而不能看長度,增加元素,删除元素,這是為何?下圖代碼執行竟然出錯!

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

解答:因為将數組轉換的清單其實不是我們經常使用的arrayList,但隻是數組中内部定義的一種資料結構類型,本質還是原數組而并非清單,是以當向清單添加元素就會出現錯誤,這道題上當的兄弟不少吧。

5.将清單中李明的名字移除掉,下圖實作有無問題?

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

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

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

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

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

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

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

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

8.面試官:你能說出來java中實作多線程的幾種方法麼?

面試者:繼承Thread類和實作runnable接口!

面試官:除此以外還有方法麼?

面試者:就這兩種實作啊?!

面試官:我們聊點别的,呵呵。

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

9.我隻是想讓這個好好循環三次,有什麼問題麼?

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

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

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

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

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

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

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

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