Java基礎(chǔ)07 string stringbuffer stringbuilder的用法及區(qū)別

一、String

1、String 類代表字符串。Java 程序中的所有字符串字面值(如 "abc" )都作為此類的實(shí)例實(shí)現(xiàn)。

2、字符串是常量;它們的值在創(chuàng)建之后不能更改。字符串緩沖區(qū)支持可變的字符串。因?yàn)?String 對象是不可變的,所以可以共享。

3、string的常用方法
(1)1、length() 字符串的長度,String length() 是針對數(shù)組來說的
  例:char chars[]={'a','b'.'c'};
    String s=new String(chars);
    int len=s.length();

(2)charAt() 截取一個字符
  例:char ch;
    ch="abc".charAt(1); 返回’b'

(3)startsWith()和endsWith()  
startsWith()方法決定是否以特定字符串開始, endWith()方法決定是否以特定字符串結(jié)束
(4)equals()和==
  equals()方法比較字符串對象中的字符,==運(yùn)算符比較兩個對象是否引用同一實(shí)例。
  例:String s1="Hello";
    String s2=new String(s1);
    s1.eauals(s2); //true
    s1==s2;//false
(5)substring()截取一段字符。它有兩種形式,遵循前閉后開的原則。
第一種是:String substring(int startIndex);
第二種是:String substring(int startIndex,int endIndex)
(6)replace() 替換
  它有兩種形式,第一種形式用一個字符在調(diào)用字符串中所有出現(xiàn)某個字符的地方進(jìn)行替換,形式如下:
  String replace(char original,char replacement)
  例如:String s="Hello".replace('l','w');
  第二種形式是用一個字符序列替換另一個字符序列,形式如下:
  String replace(CharSequence original,CharSequence replacement)
用后一個字符串替換前一個字符
(7)java.lang.String.contains() 方法返回true,當(dāng)且僅當(dāng)此字符串包含指定的char值序列 返回值為boolean
(8)concat()連接字符串:string1.concat(string2);
(9)String trim() 返回字符串的一個副本,開頭和結(jié)尾的空格去除。

二、StringBuffer

1、StringBuffer是線程安全的可變字符序列。一個類似于 String
的字符串緩沖區(qū),但不能修改。雖然在任意時間點(diǎn)上它都包含某種特定的字符序列,但通過某些方法調(diào)用可以改變該序列的長度和內(nèi)容。

2、可將字符串緩沖區(qū)安全地用于多個線程。可以在必要時對這些方法進(jìn)行同步,因此任意特定實(shí)例上的所有操作就好像是以串行順序發(fā)生的,該順序與所涉及的每個線程進(jìn)行的方法調(diào)用順序一致。

3、StringBuffer上的主要操作是 append 和 insert方法,可重載這些方法,以接受任意類型的數(shù)據(jù)。每個方法都能有效地將給定的數(shù)據(jù)轉(zhuǎn)換成字符串,然后將該字符串的字符追加或插入到字符串緩沖區(qū)中。append方法始終將這些字符添加到緩沖區(qū)的末端;而 insert方法則在指定的點(diǎn)添加字符。

三、StringBuilder

1、一個可變的字符序列。此類提供一個與 StringBuffer兼容的 API,但不保證同步。該類被設(shè)計用作 StringBuffer的一個簡易替換,用在字符串緩沖區(qū)被單個線程使用的時候(這種情況很普遍)。如果可能,建議優(yōu)先采用該類,因?yàn)樵诖蠖鄶?shù)實(shí)現(xiàn)中,它比 StringBuffer要快。

2、在 StringBuilder上的主要操作是 append和 insert方法,可重載這些方法,以接受任意類型的數(shù)據(jù)。每個方法都能有效地將給定的數(shù)據(jù)轉(zhuǎn)換成字符串,然后將該字符串的字符追加或插入到字符串生成器中。append方法始終將這些字符添加到生成器的末端;而 insert方法則在指定的點(diǎn)添加字符。
例如:
如果 z引用一個當(dāng)前內(nèi)容為 "start" 的字符串的生成器對象,則該方法調(diào)用 z.append("le")將使字符串生成器包含 "startle",而 z.insert(4, "le")將更改字符串生成器,使之包含 "starlet"。

3、通常,如果 sb 引用 StringBuilder的實(shí)例,則 sb.append(x)和 sb.insert(sb.length(), x)具有相同的效果。每個字符串生成器都有一定的容量。只要字符串生成器所包含的字符序列的長度沒有超出此容量,就無需分配新的內(nèi)部緩沖區(qū)。如果內(nèi)部緩沖區(qū)溢出,則此容量自動增大。

4、將 StringBuilder的實(shí)例用于多個線程是不安全的。如果需要這樣的同步,則建議使用 StringBuffer

四、String、StringBuffer、StringBuilder的區(qū)別

1、String是字符串常量,StringBuffer、StringBuilder是字符串變量
(1) 因?yàn)槲覀兘?jīng)常會做這樣的操作:

  String s = "asd";
  s = s+1;
  System.out.print(s);// result : asd1

感覺上s是變了,其實(shí)不是。在JVN中是這樣執(zhí)行這段代碼的:先為s開辟一個存儲空間,來存儲asd,在執(zhí)行s = s + 1時,再為s開辟存儲空間來存s + 1
原來的s是不變的,所以String是常量。
由于這種機(jī)制,每當(dāng)用String操作字符串時,實(shí)際上是在不斷的創(chuàng)建新的對象,而原來的對象就會變?yōu)槔唬牵没厥盏簦孕屎艿汀?br> (2)看下面的操作:

  String str = “a” + “ b” + “ c”;
  StringBuilder builder = new StringBuilder(“a”).append(“ b”).append(“ c”);

感覺上是String比StringBuilder快了一些,但是如果換一下:

  String s1 = "a";
  String s2 = "b";
  String s3 = "c";
  String s4 = s1 + s2 + s3;

這樣就能看出來了。

2、三者在執(zhí)行速度方面的比較:StringBuilder > StringBuffer > String

3、StringBuilder與 StringBuffer:StringBuilder:線程非安全的;StringBuffer:線程安全的
當(dāng)我們在字符串緩沖去被多個線程使用是,JVM不能保證StringBuilder的操作是安全的,雖然他的速度最快,但是可以保證StringBuffer是可以正確操作的。當(dāng)然大多數(shù)情況下就是我們是在單線程下進(jìn)行的操作,所以大多數(shù)情況下是建議用StringBuilder而不用StringBuffer的,就是速度的原因。

4、總結(jié):
對于三者使用的總結(jié):
(1)如果要操作少量的數(shù)據(jù)用 = String
(2)單線程操作字符串緩沖區(qū) 下操作大量數(shù)據(jù) = StringBuilder
(3)多線程操作字符串緩沖區(qū) 下操作大量數(shù)據(jù) = StringBuffer

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,546評論 6 533
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,570評論 3 418
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,505評論 0 376
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,017評論 1 313
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 71,786評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,219評論 1 324
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,287評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,438評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,971評論 1 335
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 40,796評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 42,995評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,540評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,230評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,662評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,918評論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,697評論 3 392
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 47,991評論 2 374

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