淺入深出JavaSE面試題:String,StringBuilder,StringBuffer區(qū)別與聯(lián)系


String,StringBuilder,StringBuffer都表示字符串,但是你真的了解過它們的區(qū)別嗎
好,我們先看一下,網(wǎng)上大神們給我們準(zhǔn)備好的答案:

答:
1.String的長度是不可變的;
2.StringBuffer的長度是可變的,如果你對字符串中的內(nèi)容經(jīng)常進行操作,
  特別是內(nèi)容要修改時,那么使用StringBuffer,如果最后需要String,那使用StringBuffer的toString()方法;線程安全;
3.StringBuilder是從JDK5開始,為StringBuffer該類補充了一個單個線程使用的等價類;
  通常應(yīng)該優(yōu)先使用StringBuilder類,因為它支持所有相同的操作,但由于它不執(zhí)行同步,所以速度更快。

那么我是如何給大家演示它們的區(qū)別和聯(lián)系呢

工具:JDK API 1.6

<h5>#1 結(jié)構(gòu)體系</h5>

1.都是java.lang.*包下面的類,所以不用導(dǎo)包(核心包是不需要導(dǎo)包的)
2.都實現(xiàn)了CharSequence接口(字符序列化)
什么是字符序列,什么是字符串定義,請期待我以后的JavaSE基礎(chǔ)知識點講解
3.底層都是對char[]數(shù)組的封裝

繼承體系.png

<h5>#2 可變與不可變的字符串</h5>

String是不可變的,StringBuilder與StringBuffer是可變字符串

String底層代碼.png

什么是可變,什么是不可變,我將畫兩張簡陋的內(nèi)存分析圖給大家看

string字符串追加字符串時.png
StringBuilder字符串拼接.png

<h5>#3 線程安全分析</h5>

StringBuilder是線程不安全的,StringBuffer是線程安全的(這個看源碼嘛~)

舉個栗子


StringBuilder.png
StringBuffer.png

看到synchronized這個修飾符,你該懂了嘛

<h5>#4 速度測試</h5>

相同的字符串拼接下 耗時:String>StringBuffer>StringBuilder
因為string是不可變的,每改變內(nèi)容一次,就會創(chuàng)建一塊新的內(nèi)存空間來存放對象的值,StringBuffer因為有synchronized修飾,所以效率相對StringBuilder較慢,但是安全

<h5># 總結(jié)</h5>

String和StringBuilder以及StringBuffer的區(qū)別(建議使用StringBuilder):
StringBuffer和StringBuilder都表示可變的字符串,功能方法都是相同的.

唯一的區(qū)別:
StringBuffer: StringBuffer中的方法都使用了synchronized修飾符,表示同步的,在多線程并發(fā)的時候可以保證線程安全,保證線程安全的時候,性能(速度)較低.
StringBuilder:StringBuilder中的方法都沒有使用了synchronized修飾符,不安全,但是性能較高.

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容