Java中String磁滚、StringBuffer與StringBuilder的區(qū)別與聯(lián)系

java編程中經(jīng)常使用String佛吓,StringBuffer和StringBuilder或許僅常用其中一個,其實(shí)StringBuffer與StringBuilder的方法都差不多垂攘, 傻傻的并不能區(qū)分這兩個有什么區(qū)別维雇。最近偶遇到順便查閱資料總結(jié)下。
String晒他、StringBuffer與StringBuilder
1吱型、可變與不可變
String是不可變的≡山觯看下String的源碼即可知津滞。
而StringBuffer與StringBuilder雖也是final铝侵,但都是繼承自AbstractStringBuilder,其append實(shí)現(xiàn)方法都是重寫AbstractStringBuilder里的触徐。
2咪鲜、線程安全與不安全
String中的對象是不可變的,可看為常量锌介,所以是線程安全的
StringBuffer也是線程安全的嗜诀。其主要方法都加了synchronized,顯然線程安全孔祸。部分源碼如下:
而StringBuilder的方法沒有加synchronized隆敢,在多線程下是不安全的。
線程安全與不安全造成了StringBuilder與StringBuffer在效率方面有區(qū)別崔慧。
這三者的速度排序是這樣的:
String<StringBuffer<StringBuilder
所以拂蝎,在經(jīng)常要操作字符串的情況下,多線程下惶室,盡量用StringBuffer温自,單線程下,則盡量使用StringBuilder
或許會有疑問:String為什么是最慢的皇钞,String不是經(jīng)车棵冢看到String = str1+str2嗎?為什么是不可變的夹界?
其實(shí)jvm在實(shí)現(xiàn)String的加減并不是簡單的加減馆里。
Jvm有一個常量池,用來存放常量可柿,并且是線程共享的鸠踪。
如:

String s2= "abc";

實(shí)際上jvm會在常量池創(chuàng)建“abc”這個常量對象。而s2再次賦值為abc時复斥,jvm會先到常量池查找营密,找到后,并不會再次創(chuàng)建這個對象目锭,而只是返回了abc這個對象的引用而已评汰,即s1和s2此時指的同一個對象,其值也是一樣痢虹。

String s3 = new String("abc");

此時創(chuàng)建兩個對象键俱,一個存放在堆中(String對象),一個存放在常量池中("abc"),還有一個對象引用s3世分,存放在棧编振。
這個時候如果在new一個對象,如下:
此時只創(chuàng)建一個對象,和存放在棧上的引用s4踪央,jvm檢測到常量池里存有abc了臀玄,直接把a(bǔ)bc引用給了s4.

String s5 = "ab"+"cd";

這個加法編譯時會自動優(yōu)化了。因?yàn)閮蓚€常量的值都是已經(jīng)確定了的畅蹂。相當(dāng)于String s5="abcd";所以這個過程還是很快的

但是如果是下面的加法;

String s6 = "ab";
String s7 = "cd";
String s8 = s6+s7;
String s9 ="abcd";

則可就不一樣了健无。s6和s7都是對象,編譯時其值不是確定的液斜,所以不會自動優(yōu)化累贤。而底層對這個加法的實(shí)現(xiàn)是這樣的。運(yùn)行時jvm創(chuàng)建一個StringBuilder少漆。并用s6所指的字符串完成初始化臼膏,然后用這個StringBuilder對象調(diào)用append方法合并s7的字符串cd,在調(diào)用StringBuilder的toString方法完成類型轉(zhuǎn)換示损,形成的新對象即引用給s8渗磅。這會導(dǎo)致s8!=s9.所以String的加法整體上說沒有StringBuffer和StringBuilder的效率高检访。

final String s1 = "cd;
String s2= "ab" + s1;
String s3 = "abcd";
System.out.println("s2 = s3 : "+ (s2 == s3)); 

上面的str1在編譯時會被認(rèn)為是常量始鱼,所以s2+s1這里會被編譯優(yōu)化。所以導(dǎo)致最后s2和s3是同一個對象脆贵。運(yùn)行結(jié)果為true

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末医清,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子卖氨,更是在濱河造成了極大的恐慌会烙,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,941評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件双泪,死亡現(xiàn)場離奇詭異,居然都是意外死亡密似,警方通過查閱死者的電腦和手機(jī)焙矛,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來残腌,“玉大人村斟,你說我怎么就攤上這事∨酌ǎ” “怎么了蟆盹?”我有些...
    開封第一講書人閱讀 165,345評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長闺金。 經(jīng)常有香客問我逾滥,道長,這世上最難降的妖魔是什么败匹? 我笑而不...
    開封第一講書人閱讀 58,851評論 1 295
  • 正文 為了忘掉前任寨昙,我火速辦了婚禮讥巡,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘舔哪。我一直安慰自己欢顷,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,868評論 6 392
  • 文/花漫 我一把揭開白布捉蚤。 她就那樣靜靜地躺著抬驴,像睡著了一般。 火紅的嫁衣襯著肌膚如雪缆巧。 梳的紋絲不亂的頭發(fā)上布持,一...
    開封第一講書人閱讀 51,688評論 1 305
  • 那天,我揣著相機(jī)與錄音盅蝗,去河邊找鬼鳖链。 笑死,一個胖子當(dāng)著我的面吹牛墩莫,可吹牛的內(nèi)容都是我干的芙委。 我是一名探鬼主播,決...
    沈念sama閱讀 40,414評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼狂秦,長吁一口氣:“原來是場噩夢啊……” “哼灌侣!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起裂问,我...
    開封第一講書人閱讀 39,319評論 0 276
  • 序言:老撾萬榮一對情侶失蹤侧啼,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后堪簿,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體痊乾,經(jīng)...
    沈念sama閱讀 45,775評論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年椭更,在試婚紗的時候發(fā)現(xiàn)自己被綠了哪审。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,096評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡虑瀑,死狀恐怖湿滓,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情舌狗,我是刑警寧澤叽奥,帶...
    沈念sama閱讀 35,789評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站痛侍,受9級特大地震影響朝氓,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,437評論 3 331
  • 文/蒙蒙 一膀篮、第九天 我趴在偏房一處隱蔽的房頂上張望嘹狞。 院中可真熱鬧,春花似錦誓竿、人聲如沸磅网。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽涧偷。三九已至,卻和暖如春毙死,著一層夾襖步出監(jiān)牢的瞬間燎潮,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評論 1 271
  • 我被黑心中介騙來泰國打工扼倘, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留确封,地道東北人。 一個月前我還...
    沈念sama閱讀 48,308評論 3 372
  • 正文 我出身青樓再菊,卻偏偏與公主長得像爪喘,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子纠拔,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,037評論 2 355

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