前言:
String,StringBuilder,StringBuffer的區別是啥?這個面試題估計每個程式員都應該碰到過吧,依稀記得第一次面試的時候,面試官問我這個問題時,心想著這不是很簡單嗎,深入了解這個問題后,發現這里面并不簡單,面試官的套路還是深啊!

面試官:你好,歡迎來面試,介紹一下自己吧,
你好,我是**, 來自 **,畢業于拖拉機學院,目前作業了2年,在 ** 公司做了一年的開發,做過的專案有,,,布拉布拉
然后雙方對專案進行深入的討論,,,
然后進行基礎問答環節
下面挖坑套路來了

面試官:那你能說一下String,StringBuilder,StringBuffer到底有什么區別嗎?
String的值是不可改變的,這就導致每次對String的操作都會生成新的String物件,不禁效率底下, 而且浪費大量的記憶體空間;StringBuilder是可變類,任何對他指向的字串的操作都不會產生新的對 象,但單執行緒不安全;StringBuffer底層方法使用了synchronized關鍵字,執行緒比較安全,但效率 較StringBuilder慢;
面試官:String類它可以被繼承嗎?
不可以,因為String類使用final關鍵字進行修飾,所以不能被繼承,并且StringBuilder,StringBuffer也是如此都被final關鍵字修飾,
面試官:為什么String的是不可變的?
因為存盤資料的char陣列是使用final進行修飾的,所以不可變,

面試官:為什么String Buffer是執行緒安全的?
這是因為在StringBuffer類內,常用的方法都使用了synchronized 進行同步所以是執行緒安全的,然而StringBuilder并沒有,這也就是運行速度StringBuilder > StringBuffer的原因了,
另外本人整理了20年面試題大全,包含spring、并發、資料庫、Redis、分布式、dubbo、JVM、微服務等方面總結,下圖是部分截圖,需要的話點這里點這里,暗號CSDN,

面試官:剛才你說到了synchronized關鍵字 ,那能講講synchronized的表現形式嘛?
- 對于靜態同步方法,鎖是當前類的class物件,
- 對于普通同步方法 ,鎖是當前實體物件,
- 對于同步方法塊,鎖是Synchonized括號配置的物件,
面試官:能講講synchronized的原理嘛?
我傻了問的這么深的嗎,面試官不簡單啊
synchronized是一個重量級鎖,實作依賴于JVM 的 monitor 監視器鎖,主要使用monitorenter和monitorexit指令來實作方法同步和代碼塊同步,在編譯的是時候,會將monitorexit指令插入到同步代碼塊的開始位置,而monitorexit插入方法結束處和例外處,并且每一個monitorexit都有一個與之對應的monitorexit,
任何物件都有一個monitor與之關聯,當一個monitor被持有后,它將被處于鎖定狀態,執行緒執行到monitorenter指令時間,會嘗試獲取物件所對應的monitor的所有權,即獲取獲得物件的鎖,由于在編譯期會將monitorexit插入到方法結束處和例外處,所以在方法執行完畢或者出現例外的情況會自動釋放鎖,
面試官:內心OS:竟然沒問倒他,看來讓他培訓是沒啥希望了,讓他回去等通知吧 ,
你的水平我這邊基本了解了,我對你還是比較滿意的,但是我們這邊還有幾個候選人還沒面試,沒辦法直接給你答復,你先回去等通知吧,
??
我:好的好的,謝謝面試官,我這邊先回去了,內心OS:好險好險,一個string差點被問倒,幸好面試前好好看了一下,不然今天就是面試慘案了,

最后:
針對最近很多人都在面試,我這邊也整理了相當多的面試專題資料,也有其他大廠的面經,希望可以幫助到大家,
下面的面試題答案都整理成檔案筆記,也還整理了一些面試資料&最新2020收集的一些大廠的面試真題(都整理成檔案,小部分截圖),有需要的可以點擊進入暗號CSDN


轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/225891.html
標籤:其他
上一篇:(二) RabbitMQ快速入門, 一篇文章教會你使用RabbitMQ并理解訊息發布模型(SpringBoot版)

