網(wǎng)站建設(shè)公司生存百度收錄提交入口
(1)一個可愛的字符序列。此類提供一個與StringBuffer兼容的API,但不保證同步(StringBuilder不是線程安全的),該類被設(shè)計用作StringBuffer的一個簡易替換,用在字符串緩沖區(qū)被單個線程使用的時候。如果可能,建議優(yōu)先采用該類,因為在大多數(shù)實現(xiàn)中,他比StirngBuilder要快。
(2)在StringBulider上的主要操作是append和insert方法,可重載這些方法,以接受任意類型的數(shù)據(jù)。
我們查看StringBuilder的類圖:
我們發(fā)現(xiàn)StringBuffer與StringBuild的父類完全一樣。
StringBuilder(單線程)和StringBuffer(多線程)均代表可變的字符序列,方法是一樣的,所以使用和StringBuffer一樣。?
我們查看StringBuilder的源碼如下所示:
?我們查看數(shù)據(jù)保存到哪里,我們查看它所存儲的父類:
仍然和StringBuffer一樣,數(shù)據(jù)保存在value數(shù)組里面。
我們發(fā)現(xiàn)StringBuilder的方法里面沒有synchronized,沒有同步的。
?
?
package com.ypl.StringBuilder_;public class StringBuild01 {public static void main(String[] args) {//1.StirngBuilder繼承AbstractStringBuilder類//2.實現(xiàn)了 Serializable,說明StringBuilder的對象可以串行化(該對象可以網(wǎng)絡(luò)傳輸,可以保存到文件里)//3.StringBuilder是final類,不能被繼承//4.StringBuilder對象字符序列仍然是存放在其父類AbstractStringBuilder的char [] value。//因此,字符序列是堆中//5.StringBuilder沒有做互斥的處理,即沒有synchronized關(guān)鍵字,因此在單線程的情況下使用StringBuilder.StringBuilder stringBuilder = new StringBuilder();}
}
?String、StringBuffer和StringBuilder的比較
(1)StringBuilder和StringBuffer非常類似,均代表可變的字符序列,而且方法也一樣
(2)String:不可變字符序列,效率低,但是復(fù)用率(常量池里面有的內(nèi)容可以被多個對象使用)高。
(3)StringBuffer:可變字符序列、效率較高(增刪)、線程安全(synchorized同步代碼塊)
(4)StringBuilder:可變字符序列、效率最高、線程不安全
(5)如果從效率來看,StringBuilder的效率最高。StringBuilder>StringBuffer>String。
? ? ? ? ?如果從安全來看,StringBuffer的最安全。
(5)String使用注意說明:
package com.ypl.StringBuilder_;public class StringBuilder02 {public static void main(String[] args) {String s ="a"; //創(chuàng)建了一個字符串s+="b"; /*實際原來的"a"字符串對象已經(jīng)丟棄了,現(xiàn)在又產(chǎn)生了一個字符串s+"b"(也就是”ab")。如果多次執(zhí)行這些改變串內(nèi)容的操作,會導(dǎo)致大量副本字符串對象存留在內(nèi)存中,降低效率。如果這樣的操作放到循環(huán)中,會極大影響程序的性能 =>結(jié)論:如果我們對String做大量修改,不要使用String。*/}
}
我們來測試StringBuffer和StringBuilder和String的效率:
package com.ypl.StringBuilder_;public class StringStringBuilderStringBuffer {public static void main(String[] args) {String text="";long startTime=0;long endTime=0;StringBuffer buffer =new StringBuffer(text);StringBuilder builder = new StringBuilder(text);startTime = System.currentTimeMillis();for (int i=0;i<200000;i++){ //StringBuffer拼接20000次buffer.append(String.valueOf(i));}endTime=System.currentTimeMillis();System.out.println("StringBuffer的執(zhí)行時間:+"+(endTime-startTime));startTime=System.currentTimeMillis();for (int i=0;i<200000;i++){ //StringBuilder拼接20000次builder.append(String.valueOf(i));}endTime=System.currentTimeMillis();System.out.println("StringBuilder的執(zhí)行時間:"+(endTime-startTime));startTime=System.currentTimeMillis();for (int i=0;i<200000;i++){ //String拼接20000次text=text+i;}endTime=System.currentTimeMillis();System.out.println("String的執(zhí)行時間:"+(endTime-startTime));}
}
我們運行之后如下所示:
?
我們發(fā)現(xiàn)StringBuilder的執(zhí)行時間最短,然后是StringBuffer,最后是String。
使用的原則,結(jié)論:
1.如果字符串存在大量的修改操作,一般使用StringBuffer或StringBuilder
2.?如果字符串存在大量的修改操作,并在單線程的情況,使用StringBuilder
3.如果字符串存在大量的修改操作,并在多線程的情況,使用StringBuffer
4.如果我們字符串很少修改,被多個對象引用,使用String,比如配置信息等
StringBuilder的方法使用和StringBuffer一樣。