String立肘,StringBuilder边坤,StringBuffer

String,StringBuilder谅年,StringBuffer

String 字符串常量茧痒,對(duì)一串字符進(jìn)行操作。不可變類融蹂。
StringBuffer 字符串變量(線程安全)旺订。也是對(duì)一串字符進(jìn)行操作,但是可變類超燃。
StringBuilder 字符串變量(非線程安全)区拳。也是對(duì)一串字符進(jìn)行操作,但是可變類意乓。

String:
是對(duì)象不是原始類型.
為不可變對(duì)象,一旦被創(chuàng)建,就不能修改它的值.
對(duì)于已經(jīng)存在的String對(duì)象的修改都是重新創(chuàng)建一個(gè)新的對(duì)象樱调,然后把新的值保存進(jìn)去.
String 是final類,即不能被繼承.

StringBuffer:
是一個(gè)可變對(duì)象届良,當(dāng)對(duì)他進(jìn)行修改的時(shí)候不會(huì)像String那樣重新建立對(duì)象
它只能通過構(gòu)造函數(shù)來建立笆凌,StringBuffer sb = new StringBuffer();
備注:不能通過賦值符號(hào)對(duì)他進(jìn)行賦值.
對(duì)象被建立以后,在內(nèi)存中就會(huì)分配內(nèi)存空間,并初始保存一個(gè)null.向StringBuffer中付值的時(shí)候可以通過它的append方法.
sb.append("hello");

字符串連接操作中StringBuffer的效率要比String高:
String str = new String("welcome to "); str += "here";
的處理步驟實(shí)際上是通過建立一個(gè)StringBuffer,讓侯調(diào)用append(),最后再將StringBuffer toSting();
這樣的話String的連接操作就比StringBuffer多出了一些附加操作,當(dāng)然效率上要打折扣.

并且由于String 對(duì)象是不可變對(duì)象,每次操作Sting 都會(huì)重新建立新的對(duì)象來保存新的值.
這樣原來的對(duì)象就沒用了,就要被垃圾回收.這也是要影響性能的.

看看以下代碼:
將26個(gè)英文字母重復(fù)加了5000次,
String tempstr = "abcdefghijklmnopqrstuvwxyz";
int times = 5000;
long lstart1 = System.currentTimeMillis();
String str = "";
for (int i = 0; i < times; i++) {
str += tempstr;
}
long lend1 = System.currentTimeMillis();
long time = (lend1 - lstart1);
System.out.println(time);
可惜我的計(jì)算機(jī)不是超級(jí)計(jì)算機(jī)士葫,得到的結(jié)果每次不一定一樣一般為 46687左右乞而。
也就是46秒。
我們?cè)倏纯匆韵麓a
String tempstr = "abcdefghijklmnopqrstuvwxyz";
int times = 5000;
long lstart2 = System.currentTimeMillis();
StringBuffer sb = new StringBuffer();
for (int i = 0; i < times; i++) {
sb.append(tempstr);
}
long lend2 = System.currentTimeMillis();
long time2 = (lend2 - lstart2);
System.out.println(time2);
得到的結(jié)果為 16 有時(shí)還是 0
所以結(jié)論很明顯为障,StringBuffer 的速度幾乎是String 上萬倍晦闰。當(dāng)然這個(gè)數(shù)據(jù)不是很準(zhǔn)確。因?yàn)檠h(huán)的次數(shù)在100000次的時(shí)候鳍怨,差異更大呻右。不信你試試。

根據(jù)上面所說:
str += "here";
的處理步驟實(shí)際上是通過建立一個(gè)StringBuffer,讓侯調(diào)用append(),最后
再將StringBuffer toSting();
所以str += "here";可以等同于
StringBuffer sb = new StringBuffer(str);
sb.append("here");
str = sb.toString();
所以上面直接利用"+"來連接String的代碼可以基本等同于以下代碼
String tempstr = "abcdefghijklmnopqrstuvwxyz";
int times = 5000;
long lstart2 = System.currentTimeMillis();
String str = "";
for (int i = 0; i < times; i++) {
StringBuffer sb = new StringBuffer(str);
sb.append(tempstr);
str = sb.toString();
}
long lend2 = System.currentTimeMillis();
long time2 = (lend2 - lstart2);
System.out.println(time2);
平均執(zhí)行時(shí)間為46922左右鞋喇,也就是46秒声滥。

在某些特別情況下, String 對(duì)象的字符串拼接其實(shí)是被 JVM 解釋成了 StringBuffer 對(duì)象的拼接侦香,所以這些時(shí)候 String 對(duì)象的速度并不會(huì)比 StringBuffer 對(duì)象慢落塑,而特別是以下的字符串對(duì)象生成中, String 效率是遠(yuǎn)要比 StringBuffer 快的:
String S1 = “This is only a” + “ simple” + “ test”;
StringBuffer Sb = new StringBuilder(“This is only a”).append(“ simple”).append(“ test”);
你會(huì)很驚訝的發(fā)現(xiàn)罐韩,生成 String S1 對(duì)象的速度簡(jiǎn)直太快了憾赁,而這個(gè)時(shí)候 StringBuffer 居然速度上根本一點(diǎn)都不占優(yōu)勢(shì)。其實(shí)這是 JVM 的一個(gè)把戲散吵,在 JVM 眼里龙考,這個(gè)
String S1 = “This is only a” + “ simple” + “test”; 其實(shí)就是:
String S1 = “This is only a simple test”; 所以當(dāng)然不需要太多的時(shí)間了蟆肆。但大家這里要注意的是,如果你的字符串是來自另外的 String 對(duì)象的話晦款,速度就沒那么快了炎功,譬如:
String S2 = “This is only a”;
String S3 = “ simple”;
String S4 = “ test”;
String S1 = S2 +S3 + S4;
這時(shí)候 JVM 會(huì)規(guī)規(guī)矩矩的按照原來的方式去做

總結(jié): 如果在程序中需要對(duì)字符串進(jìn)行頻繁的修改連接操作的話.使用StringBuffer性能會(huì)更高

StringBuffer
Java.lang.StringBuffer線程安全的可變字符序列。一個(gè)類似于 String 的字符串緩沖區(qū)缓溅,但不能修改蛇损。雖然在任意時(shí)間點(diǎn)上它都包含某種特定的字符序列,但通過某些方法調(diào)用可以改變?cè)撔蛄械拈L(zhǎng)度和內(nèi)容坛怪。
可將字符串緩沖區(qū)安全地用于多個(gè)線程淤齐。可以在必要時(shí)對(duì)這些方法進(jìn)行同步酝陈,因此任意特定實(shí)例上的所有操作就好像是以串行順序發(fā)生的床玻,該順序與所涉及的每個(gè)線程進(jìn)行的方法調(diào)用順序一致。
StringBuffer 上的主要操作是 append 和 insert 方法沉帮,可重載這些方法锈死,以接受任意類型的數(shù)據(jù)。每個(gè)方法都能有效地將給定的數(shù)據(jù)轉(zhuǎn)換成字符串穆壕,然后將該字符串的字符追加或插入到字符串緩沖區(qū)中待牵。append 方法始終將這些字符添加到緩沖區(qū)的末端;而 insert 方法則在指定的點(diǎn)添加字符喇勋。
例如缨该,如果 z 引用一個(gè)當(dāng)前內(nèi)容是“start”的字符串緩沖區(qū)對(duì)象,則此方法調(diào)用 z.append("le") 會(huì)使字符串緩沖區(qū)包含“startle”川背,而 z.insert(4, "le") 將更改字符串緩沖區(qū)贰拿,使之包含“starlet”。
在大部分情況下 StringBuilder > StringBuffer
java.lang.StringBuilde
java.lang.StringBuilder一個(gè)可變的字符序列是5.0新增的熄云。此類提供一個(gè)與 StringBuffer 兼容的 API膨更,但不保證同步。該類被設(shè)計(jì)用作 StringBuffer 的一個(gè)簡(jiǎn)易替換缴允,用在字符串緩沖區(qū)被單個(gè)線程使用的時(shí)候(這種情況很普遍)荚守。如果可能,建議優(yōu)先采用該類练般,因?yàn)樵诖蠖鄶?shù)實(shí)現(xiàn)中矗漾,它比 StringBuffer 要快。兩者的方法基本相同薄料。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末敞贡,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子摄职,更是在濱河造成了極大的恐慌嫡锌,老刑警劉巖虑稼,帶你破解...
    沈念sama閱讀 216,544評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件琳钉,死亡現(xiàn)場(chǎng)離奇詭異势木,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)歌懒,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,430評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門啦桌,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人及皂,你說我怎么就攤上這事甫男。” “怎么了验烧?”我有些...
    開封第一講書人閱讀 162,764評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵板驳,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我碍拆,道長(zhǎng)若治,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,193評(píng)論 1 292
  • 正文 為了忘掉前任感混,我火速辦了婚禮端幼,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘弧满。我一直安慰自己婆跑,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,216評(píng)論 6 388
  • 文/花漫 我一把揭開白布庭呜。 她就那樣靜靜地躺著滑进,像睡著了一般。 火紅的嫁衣襯著肌膚如雪募谎。 梳的紋絲不亂的頭發(fā)上扶关,一...
    開封第一講書人閱讀 51,182評(píng)論 1 299
  • 那天,我揣著相機(jī)與錄音近哟,去河邊找鬼驮审。 笑死,一個(gè)胖子當(dāng)著我的面吹牛吉执,可吹牛的內(nèi)容都是我干的疯淫。 我是一名探鬼主播,決...
    沈念sama閱讀 40,063評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼戳玫,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼熙掺!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起咕宿,我...
    開封第一講書人閱讀 38,917評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤币绩,失蹤者是張志新(化名)和其女友劉穎蜡秽,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體缆镣,經(jīng)...
    沈念sama閱讀 45,329評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡芽突,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,543評(píng)論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了董瞻。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片寞蚌。...
    茶點(diǎn)故事閱讀 39,722評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖钠糊,靈堂內(nèi)的尸體忽然破棺而出挟秤,到底是詐尸還是另有隱情,我是刑警寧澤抄伍,帶...
    沈念sama閱讀 35,425評(píng)論 5 343
  • 正文 年R本政府宣布艘刚,位于F島的核電站,受9級(jí)特大地震影響截珍,放射性物質(zhì)發(fā)生泄漏攀甚。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,019評(píng)論 3 326
  • 文/蒙蒙 一笛臣、第九天 我趴在偏房一處隱蔽的房頂上張望云稚。 院中可真熱鬧,春花似錦沈堡、人聲如沸静陈。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,671評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)鲸拥。三九已至,卻和暖如春僧免,著一層夾襖步出監(jiān)牢的瞬間刑赶,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,825評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工懂衩, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留撞叨,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,729評(píng)論 2 368
  • 正文 我出身青樓浊洞,卻偏偏與公主長(zhǎng)得像牵敷,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子法希,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,614評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容