String沧踏、StringBuffer、StringBuilder區(qū)別

String作為Java里面最重要的一個類巾钉,關(guān)于字符串構(gòu)造的類翘狱,有StringStringBuilder睛琳、StringBuffer盒蟆。那么三者有什么區(qū)別呢,我們來了解一下师骗。在Java中,關(guān)于構(gòu)造一個字符串有兩種方法:

  1. 直接賦值
  2. 通過new對象來構(gòu)造

我們來分析方法的內(nèi)部操作:

  • 當(dāng)我們通過直接賦值的時候讨惩,我們會在常量池里面尋找有無這個值障簿,如果有身笤,那么直接將返回它的應(yīng)用,如果沒有那就直接創(chuàng)建一個放在常量池里;常量池會生成String對象经伙,然后返回引用;
  • 當(dāng)我們通過new來構(gòu)造對象的時候钳降,也會去常量池去尋找陷虎,如果存在什么都不做,接著會在堆上建立一個String對象魂角,然后返回對象的引用昵济。
image.png
image.png

如何所示,當(dāng)我們執(zhí)行完這三條語句之后

String s1 = new String("Hi");
String s2 = "Hello";
String s3 = "Hello";

//Test
s2 == s3 //結(jié)果為True
s1 == s3 //返回False

但是當(dāng)我們需要修改s2的值的時候 : s3 = "Hi"的時候野揪,發(fā)生了什么呢访忿,是s3的值改變了么?

image.png
image.png
如上圖斯稳,當(dāng)我們執(zhí)行上圖中的兩條語句后海铆,s2的值為"Hello"。這里我們可以看到挣惰,s2的值本質(zhì)上是沒有改變卧斟,只是在常量池新創(chuàng)建一個“Hello”字符串,然后返回這個字符串的引用到s2;

關(guān)于字符串構(gòu)造的三個類

1.String

關(guān)于String字符串的構(gòu)造我們最常用的是:

String s = "I" + "am" + "tyf";

我們可以用 '+' 來構(gòu)造字符串憎茂,但是這個只適合比較短的字符串珍语,效率比較低。

2. StringBuilder

StirngBuilder是Java.lang包的一個類唇辨。它提供了StringBuffer提供的API廊酣,它是線程不安全的,所以在一些單線程的操作中赏枚,建議使用本類亡驰,因為這個在大多數(shù)實現(xiàn)中將會更快晓猛。每個字符串構(gòu)建器都有一個容量。只要字符串構(gòu)建器中包含的字符序列的長度不超過容量凡辱,則不需要分配新的內(nèi)部緩沖區(qū)戒职。如果內(nèi)部緩沖區(qū)溢出,則會自動變大透乾。常用方法:

//構(gòu)造方法
public StringBuilder(int capacity);//構(gòu)造一個沒有字符串的構(gòu)建器洪燥,參數(shù)指定初始容量

StringBuilder sb = new StringBuilder(); //構(gòu)建一個沒有字符的字符緩沖區(qū),初始容量為16

sb.append("fafaf"); //后面追加字符串
sb.insert(int offset, char[] str);

String z = "start"
StringBuilder sb = new StringBuilder(z);
sb.append("le");        //startle
sb.insert(4, "le);      //starlet
例如乳乌,如果z引用當(dāng)前內(nèi)容為“ start ”的字符串構(gòu)建器對象捧韵,那么方法調(diào)用z.append("le")將導(dǎo)致字符串構(gòu)建器包含“ startle ”,而z.insert(4, "le")會將字符串構(gòu)建器更改為包含“ starlet ”汉操。 

3.StringBuffer

StirngBuffer是Java.lang包的一個類再来。它是線程安全的,其在多線程操作中比較經(jīng)常使用磷瘤。StringBuffer的主要StringBuffer是append和insert方法芒篷,它們被重載以便接受任何類型的數(shù)據(jù)。每個都有效地將給定的數(shù)據(jù)轉(zhuǎn)換為字符串采缚,然后將該字符串的字符附加或插入到字符串緩沖區(qū)针炉。append方法總是在緩沖區(qū)的末尾添加這些字符;insert方法將insert添加到指定點。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末扳抽,一起剝皮案震驚了整個濱河市篡帕,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌摔蓝,老刑警劉巖赂苗,帶你破解...
    沈念sama閱讀 218,858評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異贮尉,居然都是意外死亡拌滋,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,372評論 3 395
  • 文/潘曉璐 我一進店門猜谚,熙熙樓的掌柜王于貴愁眉苦臉地迎上來败砂,“玉大人,你說我怎么就攤上這事魏铅〔蹋” “怎么了?”我有些...
    開封第一講書人閱讀 165,282評論 0 356
  • 文/不壞的土叔 我叫張陵览芳,是天一觀的道長斜姥。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么铸敏? 我笑而不...
    開封第一講書人閱讀 58,842評論 1 295
  • 正文 為了忘掉前任缚忧,我火速辦了婚禮,結(jié)果婚禮上杈笔,老公的妹妹穿的比我還像新娘闪水。我一直安慰自己,他們只是感情好蒙具,可當(dāng)我...
    茶點故事閱讀 67,857評論 6 392
  • 文/花漫 我一把揭開白布球榆。 她就那樣靜靜地躺著,像睡著了一般禁筏。 火紅的嫁衣襯著肌膚如雪持钉。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,679評論 1 305
  • 那天篱昔,我揣著相機與錄音右钾,去河邊找鬼。 笑死旱爆,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的窘茁。 我是一名探鬼主播怀伦,決...
    沈念sama閱讀 40,406評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼山林!你這毒婦竟也來了房待?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,311評論 0 276
  • 序言:老撾萬榮一對情侶失蹤驼抹,失蹤者是張志新(化名)和其女友劉穎桑孩,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體框冀,經(jīng)...
    沈念sama閱讀 45,767評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡流椒,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了明也。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片宣虾。...
    茶點故事閱讀 40,090評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖温数,靈堂內(nèi)的尸體忽然破棺而出绣硝,到底是詐尸還是另有隱情,我是刑警寧澤撑刺,帶...
    沈念sama閱讀 35,785評論 5 346
  • 正文 年R本政府宣布鹉胖,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏甫菠。R本人自食惡果不足惜挠铲,卻給世界環(huán)境...
    茶點故事閱讀 41,420評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望淑蔚。 院中可真熱鬧市殷,春花似錦、人聲如沸刹衫。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,988評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽带迟。三九已至音羞,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間仓犬,已是汗流浹背嗅绰。 一陣腳步聲響...
    開封第一講書人閱讀 33,101評論 1 271
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留搀继,地道東北人窘面。 一個月前我還...
    沈念sama閱讀 48,298評論 3 372
  • 正文 我出身青樓,卻偏偏與公主長得像叽躯,于是被迫代替她去往敵國和親财边。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,033評論 2 355

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