1. 程式人生 > 實用技巧 >由String,String Builder,String Buffer 引起的面試慘案,面試套路深回答需謹慎

由String,String Builder,String Buffer 引起的面試慘案,面試套路深回答需謹慎

前言:

String,StringBuilder,StringBuffer的區別是啥?這個面試題估計每個程式設計師都應該碰到過吧。依稀記得第一次面試的時候,面試官問我這個問題時,心想著這不是很簡單嗎。深入瞭解這個問題後,發現這裡面並不簡單,面試官的套路還是深啊!

在這裡插入圖片描述

面試官:String,StringBuilder,StringBuffer的區別是啥?

  • 從可變性來講String的是不可變的,StringBuilder,StringBuffer的長度是可變的。
  • 從執行速度上來講StringBuilder > StringBuffer > String。
  • 從執行緒安全上來StringBuilder是執行緒不安全的,而StringBuffer是執行緒安全的。

所以 String:適用於少量的字串操作的情況,StringBuilder:適用於單執行緒下在字元緩衝區進行大量操作的情況,StringBuffer:適用多執行緒下在字元緩衝區進行大量操作的情況。

另外本人整理了20年面試題大全,包含spring、併發、資料庫、Redis、分散式、dubbo、JVM、微服務等方面總結,下圖是部分截圖,需要的話點這裡點這裡,暗號CSDN。

在這裡插入圖片描述

面試官:為什麼String的是不可變的?

因為儲存資料的char陣列是使用final進行修飾的,所以不可變。
在這裡插入圖片描述
面試官:String類可以被繼承嘛?

不可以,因為String類使用final關鍵字進行修飾,所以不能被繼承,並且StringBuilder,StringBuffer也是如此都被final關鍵字修飾。

面試官:為什麼String Buffer是執行緒安全的?

這是因為在StringBuffer類內,常用的方法都使用了synchronized 進行同步所以是執行緒安全的,然而StringBuilder並沒有。這也就是執行速度StringBuilder > StringBuffer的原因了。

面試官:剛才你說到了synchronized關鍵字 ,那能講講synchronized的表現形式嘛?

  • 對於普通同步方法 ,鎖是當前例項物件。
  • 對於靜態同步方法,鎖是當前類的class物件。
  • 對於同步方法塊,鎖是Synchonized括號配置的物件。

面試官:能講講synchronized的原理嘛?

synchronized是一個重量級鎖,實現依賴於JVM 的 monitor 監視器鎖。主要使用monitorenter和monitorexit指令來實現方法同步和程式碼塊同步。在編譯的是時候,會將monitorexit指令插入到同步程式碼塊的開始位置,而monitorexit插入方法結束處和異常處,並且每一個monitorexit都有一個與之對應的monitorexit。

任何物件都有一個monitor與之關聯,當一個monitor被持有後,它將被處於鎖定狀態,執行緒執行到monitorenter指令時間,會嘗試獲取物件所對應的monitor的所有權,即獲取獲得物件的鎖,由於在編譯期會將monitorexit插入到方法結束處和異常處,所以在方法執行完畢或者出現異常的情況會自動釋放鎖。

硬菜來了

面試官:前面你提到synchronized是個重量級鎖,那它的優化有了解嘛?

為了減少獲得鎖和和釋放鎖帶來的效能損耗引入了偏向鎖、輕量級鎖、重量級鎖來進行優化,鎖升級的過程如下:

首先是一個無鎖的狀態,當執行緒進入同步程式碼塊的時候,會檢查物件頭內和棧幀中的鎖記錄裡是否存入存入當前執行緒的ID,如果沒有使用CAS 進行替換。以後該執行緒進入和退出同步程式碼塊不需要進行CAS 操作來加鎖和解鎖,只需要判斷物件頭的Mark word內是否儲存指向當前執行緒的偏向鎖。如果有表示已經獲得鎖,如果沒有或者不是,則需要使用CAS進行替換,如果設定成功則當前執行緒持有偏向鎖,反之將偏向鎖進行撤銷並升級為輕量級鎖。
  
  輕量級鎖加鎖過程,執行緒在執行同步塊之前,JVM會在當前執行緒的棧幀中建立用於儲存鎖記錄的空間,並將物件頭的Mark Word複製到鎖記錄(Displaced Mark Word)中,然後執行緒嘗試使用CAS 將物件頭中的Mark Word替換為指向鎖記錄的指標。如果成功,當前執行緒獲得鎖,反之表示其他執行緒競爭鎖,當前執行緒便嘗試使用自旋來獲得鎖。
  
  輕量級鎖解鎖過程,解鎖時,會使用CAS將Displaced Mark Word替換回到物件頭,如果成功,則表示競爭沒有發生,反之則表示當前鎖存在競爭鎖就會膨脹成重量級鎖。

在這裡插入圖片描述

面試官:內心OS:竟然沒問倒他,看來讓他培訓是沒啥希望了,讓他回去等通知吧 。

你的水平我這邊基本瞭解了,我對你還是比較滿意的,但是我們這邊還有幾個候選人還沒面試,沒辦法直接給你答覆,你先回去等通知吧。
  
我:好的好的,謝謝面試官,我這邊先回去了。內心OS:好險好險,一個string差點被問倒,幸好面試前好好看了一下,不然今天就是面試慘案了。
在這裡插入圖片描述

最後:

針對最近很多人都在面試,我這邊也整理了相當多的面試專題資料,也有其他大廠的面經。希望可以幫助到大家。

下面的面試題答案都整理成文件筆記。也還整理了一些面試資料&最新2020收集的一些大廠的面試真題(都整理成文件,小部分截圖),有需要的可以點選進入暗號CSDN

在這裡插入圖片描述

在這裡插入圖片描述