String掐隐、StringBuffer和StringBuilder

一梧兼、Define

  • String: 字符串常量
  • StringBuffer: 字符串變量(線程安全)
  • StringBuilder: 字符串變量(非線程安全)

二、 Explanation

1. String 是不可變類型乍炉,每改變一次String對象的值==聲明一個String對象馋贤,然后將該引用地址指向新的String對象赞别。這是因為String被聲明為Final class,其所有屬性也被final修飾配乓,故對于String的拼接仿滔、剪裁都必須以生成新的String對象完成,不可變模式主要在于一個String對象需要被多線程共享時犹芹,省略同步和鎖的時間開銷崎页,提高系統性能并降低多線程開發(fā)的復雜度。但需要經常改變內容時腰埂,不要使用String類型飒焦。

2. StringBuffer相對于String類型,對其修改只對 StringBuffer 對象本身進行操作屿笼,而不生成新的StringBuffer牺荠,例如使用append()、add()等方法將字符添加到目標位置驴一。StringBuffer的實現是線程安全的(synchronize)休雌,所以會用性能方面的開銷,故沒有線程安全的需要時蛔趴,使用StringBuilder的性能更好挑辆。

3. StringBuilder的是進行頻繁字符串拼接的首選類型例朱,是非線程安全的StringBuffer孝情。兩者都繼承自AbstractStringBuilder鱼蝉,區(qū)別僅在于StringBuffer的方法加上了Synchronize修飾。

StringBuffer/StringBuilder 內部由數組實現(char箫荡,JDK9 使用byte)魁亦,且初始長度為16,可以通過合理的長度估計羔挡,指定其大小以避免擴容和arraycopy導致的性能開銷洁奈。當然,char占用2個字節(jié)绞灼,故同樣數組長度下利术,JDK9中使用byte使存儲能力退化了一倍。

三低矮、Example

1.字符串的構造

在實際使用中印叁,JVM通常將String解釋成StringBuffer對象進行拼接,所以這些時候 String 對象的速度并不會比 StringBuffer 對象慢军掂。而像以下的字符串對象的聲明時轮蜕, String 效率 StringBuffer 還要快:

String S1 = “This is only a” + “ simple” + “ test”;
StringBuffer Sb = new StringBuffer(“This is only a”).append(“ simple”).append(“ test”); 

在這種情況下,JVM直接將

String s = "This is only a" + " simple" + " test"

等同于構造為

String ss = "This is only a simple test"

即 s==ss 返回的是true蝗锥;

但是跃洛,如果被拼接的字符串是來自另外的 String 對象,譬如:

String S2 = “This is only a”; 
String S3 = “ simple”; 
String S4 = “ test”; 
String S1 = S2 +S3 + S4;

JVM 按照StringBuffer方式進行拼接终议。

在JDk9中javac提供了 StringConcatFactory作為統一入口處理字符串汇竭。

2.字符串緩存

Java6后提供了intern()方法提示JVM將相應的字符串緩存以備重復利用,在創(chuàng)建字符串對象時調用intern()方法會檢查已存在常量池中的字符串穴张,并返回已存在的實例细燎。而且常量池被存儲在永久代中,并不會被GC回收陆馁。

Java8中被改為存儲在MetaSpace中找颓,緩存大小也在一直變大。8u20后JVM會將相同數據的字符串指向同一數據地址叮贩。(需使用G1 GC)

StringBuffer 的append 和 insert 方法會將新的字符串常量加入的常量池中
例如:

StringBuffer sb = new StringBuffer(“Joe”);
sb.append(" Blake");
sb.inset(3," Blake")击狮;

均會使常量池中加入“Joe Blake”。

?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末益老,一起剝皮案震驚了整個濱河市彪蓬,隨后出現的幾起案子,更是在濱河造成了極大的恐慌捺萌,老刑警劉巖档冬,帶你破解...
    沈念sama閱讀 216,919評論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡酷誓,警方通過查閱死者的電腦和手機披坏,發(fā)現死者居然都...
    沈念sama閱讀 92,567評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來盐数,“玉大人棒拂,你說我怎么就攤上這事∶登猓” “怎么了帚屉?”我有些...
    開封第一講書人閱讀 163,316評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長漾峡。 經常有香客問我攻旦,道長,這世上最難降的妖魔是什么生逸? 我笑而不...
    開封第一講書人閱讀 58,294評論 1 292
  • 正文 為了忘掉前任牢屋,我火速辦了婚禮,結果婚禮上牺陶,老公的妹妹穿的比我還像新娘伟阔。我一直安慰自己,他們只是感情好掰伸,可當我...
    茶點故事閱讀 67,318評論 6 390
  • 文/花漫 我一把揭開白布皱炉。 她就那樣靜靜地躺著,像睡著了一般狮鸭。 火紅的嫁衣襯著肌膚如雪合搅。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,245評論 1 299
  • 那天歧蕉,我揣著相機與錄音灾部,去河邊找鬼。 笑死惯退,一個胖子當著我的面吹牛赌髓,可吹牛的內容都是我干的。 我是一名探鬼主播催跪,決...
    沈念sama閱讀 40,120評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼锁蠕,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了懊蒸?” 一聲冷哼從身側響起荣倾,我...
    開封第一講書人閱讀 38,964評論 0 275
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎骑丸,沒想到半個月后舌仍,有當地人在樹林里發(fā)現了一具尸體妒貌,經...
    沈念sama閱讀 45,376評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,592評論 2 333
  • 正文 我和宋清朗相戀三年铸豁,在試婚紗的時候發(fā)現自己被綠了灌曙。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,764評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡推姻,死狀恐怖平匈,靈堂內的尸體忽然破棺而出框沟,到底是詐尸還是另有隱情藏古,我是刑警寧澤,帶...
    沈念sama閱讀 35,460評論 5 344
  • 正文 年R本政府宣布忍燥,位于F島的核電站拧晕,受9級特大地震影響,放射性物質發(fā)生泄漏梅垄。R本人自食惡果不足惜厂捞,卻給世界環(huán)境...
    茶點故事閱讀 41,070評論 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望队丝。 院中可真熱鬧靡馁,春花似錦、人聲如沸机久。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,697評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽膘盖。三九已至胧弛,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間侠畔,已是汗流浹背结缚。 一陣腳步聲響...
    開封第一講書人閱讀 32,846評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留软棺,地道東北人红竭。 一個月前我還...
    沈念sama閱讀 47,819評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像喘落,于是被迫代替她去往敵國和親茵宪。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,665評論 2 354

推薦閱讀更多精彩內容