
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ù)組的封裝

<h5>#2 可變與不可變的字符串</h5>
String是不可變的,StringBuilder與StringBuffer是可變字符串

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


<h5>#3 線程安全分析</h5>
StringBuilder是線程不安全的,StringBuffer是線程安全的(這個看源碼嘛~)
舉個栗子


看到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修飾符,不安全,但是性能較高.