JAVA String葬凳、StringBuffer绰垂、StringBuilder類解讀

JAVA String、StringBuffer火焰、StringBuilder類解讀

字符串廣泛應(yīng)用 在 Java 編程中劲装,在 Java 中字符串屬于對象,Java 提供了 String 類來創(chuàng)建和操作字符串昌简。

Java 可以通過最簡單的String str = "this is string",來創(chuàng)建字符串占业;

也可以通過構(gòu)造函數(shù)創(chuàng)建字符串String str2 = new String("this is string")來創(chuàng)建字符串。

兩者的區(qū)別

首先明白一個事纯赎,java存在一個常量池谦疾,可以用來存儲字符串常量。先知概念:

①【常量池constant pool】管理在編譯時被確定并保存在已編譯的.class文件中的一些數(shù)據(jù)犬金,包括關(guān)于類念恍、方法、接口中的常量晚顷,和字符串常量峰伙。

②【字符串常量池(String pool, String intern pool, String保留池)】 是Java堆內(nèi)存中一個特殊的存儲區(qū)域, 當(dāng)創(chuàng)建一個String對象時,假如此字符串值已經(jīng)存在于常量池中,則不會創(chuàng)建一個新的對象,而是引用已經(jīng)存在的對象。

當(dāng)使用new String(“hello”)時该默,JVM會先使用常量池來管理“hello”直接量瞳氓,再調(diào)用String類的構(gòu)造器來創(chuàng)建一個新的String對象,新創(chuàng)建的對象被保存在堆內(nèi)存中栓袖。即new String(“hello”)一共產(chǎn)生了兩個字符串對象匣摘。

問題:

//代碼1
String sa=new String("Hello world");
String sb=new String("Hello world");
System.out.println(sa==sb); // false
//代碼2
String sc="Hello world";
String sd="Hello world";
System.out.println(sc==sd);
// true

JVM為了提升性能和減少內(nèi)存開銷,避免字符串的重復(fù)創(chuàng)建裹刮,維護了一塊特殊的內(nèi)存空間——字符串常量池音榜。

String賦值的兩種方式。

1必指、String str = "test";

以這種方式賦值時囊咏,JVM會先從字符串常量池中查詢是否存在"test"這個對象,

如果存在塔橡,直接把常量池中"test"的地址返回給str梅割。如果不存在,則會在常量池中創(chuàng)建"test"對象葛家,并把該對象的地址返回給str户辞。

所以通過==比較是,str1癞谒,str2指向的是同一地址底燎,所以返回true刃榨;

2、String str = new String("test");

以這種方式賦值時双仍,JVM會先從字符串常量池中查詢是否存在"test"這個對象枢希,

若不存在則會在常量池中創(chuàng)建"test"對象,同時調(diào)用String類的構(gòu)造器在堆中創(chuàng)建"test"這個對象朱沃,然后將堆中的這個對象的地址返回賦給引用str苞轿。

若常量池存在則直接調(diào)用String類的構(gòu)造器在堆中創(chuàng)建"test"這個對象琅坡,然后將堆中的這個對象的地址返回賦給引用str错沃。

這時str1和str2分別指向堆中不同的地址,所以返回false违寞;

String為什么是不可變的翎卓?

答:最流行的Java面試題之一就是:什么是不可變對象(immutable object)契邀,不可變對象有什么好處,在什么情況下應(yīng)該用失暴,或者更具體一些坯门,Java的String類為什么要設(shè)成immutable類型? 不可變對象锐帜,顧名思義就是創(chuàng)建后不可以改變的對象田盈,典型的例子就是Java中的String類。

String s = "ABC"; s.toLowerCase();

如上s.toLowerCase()并沒有改變“ABC“的值缴阎,而是創(chuàng)建了一個新的String類“abc”允瞧,然后將新的實例的指向變量s。 相對于可變對象蛮拔,不可變對象有很多優(yōu)勢:

1).不可變對象可以提高String Pool的效率和安全性述暂。如果你知道一個對象是不可變的,那么需要拷貝這個對象的內(nèi)容時建炫,就不用復(fù)制它的本身而只是復(fù)制它的地址畦韭,復(fù)制地址(通常一個指針的大小)需要很小的內(nèi)存效率也很高肛跌。對于同時引用這個“ABC”的其他變量也不會造成影響艺配。

2).不可變對象對于多線程是安全的,因為在多線程同時進行的情況下衍慎,一個可變對象的值很可能被其他進程改變转唉,這樣會造成不可預(yù)期的結(jié)果,而使用不可變對象就可以避免這種情況稳捆。 當(dāng)然也有其他方面原因赠法,但是Java把String設(shè)成immutable最大的原因應(yīng)該是效率和安全。

當(dāng)對字符串進行修改的時候乔夯,需要使用 StringBuffer 和 StringBuilder 類砖织。

和 String 類不同的是款侵,StringBufferStringBuilder 類的對象能夠被多次的修改,并且不產(chǎn)生新的未使用對象侧纯。

在使用 StringBuffer 類時新锈,每次都會對 StringBuffer 對象本身進行操作,而不是生成新的對象茂蚓,所以如果需要對字符串進行修改推薦使用 StringBuffer壕鹉。

StringBuilder 類在 Java 5 中被提出剃幌,它和 StringBuffer 之間的最大不同在于 StringBuilder 的方法不是線程安全的(不能同步訪問)聋涨。如果一個StringBuffer對象在字符串緩沖區(qū)被多個線程使用時,StringBuffer中很多方法可以帶有synchronized關(guān)鍵字负乡,所以可以保證線程是安全的牍白,但StringBuilder的方法則沒有該關(guān)鍵字,所以不能保證線程安全抖棘,有可能會出現(xiàn)一些錯誤的操作茂腥。

由于 StringBuilder 相較于 StringBuffer 有速度優(yōu)勢,所以多數(shù)情況下建議使用 StringBuilder 類切省。

運行速度快慢為:StringBuilder > StringBuffer > String

總結(jié)

String:適用于少量的字符串操作的情況

StringBuilder:適用于單線程下在字符緩沖區(qū)進行大量操作的情況

StringBuffer:適用多線程下在字符緩沖區(qū)進行大量操作的情況

參考文獻(xiàn):

https://blog.csdn.net/u010887744/article/details/50844525

https://www.cnblogs.com/weibanggang/p/9455926.html

https://blog.csdn.net/qq_33417486/article/details/82787598

如有侵權(quán)最岗,告知必刪。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末朝捆,一起剝皮案震驚了整個濱河市般渡,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌芙盘,老刑警劉巖驯用,帶你破解...
    沈念sama閱讀 217,734評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異儒老,居然都是意外死亡蝴乔,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,931評論 3 394
  • 文/潘曉璐 我一進店門驮樊,熙熙樓的掌柜王于貴愁眉苦臉地迎上來薇正,“玉大人,你說我怎么就攤上這事囚衔⊥谘” “怎么了?”我有些...
    開封第一講書人閱讀 164,133評論 0 354
  • 文/不壞的土叔 我叫張陵佳魔,是天一觀的道長曙聂。 經(jīng)常有香客問我,道長鞠鲜,這世上最難降的妖魔是什么宁脊? 我笑而不...
    開封第一講書人閱讀 58,532評論 1 293
  • 正文 為了忘掉前任断国,我火速辦了婚禮,結(jié)果婚禮上榆苞,老公的妹妹穿的比我還像新娘稳衬。我一直安慰自己,他們只是感情好坐漏,可當(dāng)我...
    茶點故事閱讀 67,585評論 6 392
  • 文/花漫 我一把揭開白布薄疚。 她就那樣靜靜地躺著,像睡著了一般赊琳。 火紅的嫁衣襯著肌膚如雪街夭。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,462評論 1 302
  • 那天躏筏,我揣著相機與錄音板丽,去河邊找鬼。 笑死趁尼,一個胖子當(dāng)著我的面吹牛埃碱,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播酥泞,決...
    沈念sama閱讀 40,262評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼砚殿,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了芝囤?” 一聲冷哼從身側(cè)響起似炎,我...
    開封第一講書人閱讀 39,153評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎凡人,沒想到半個月后名党,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,587評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡挠轴,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,792評論 3 336
  • 正文 我和宋清朗相戀三年传睹,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片岸晦。...
    茶點故事閱讀 39,919評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡欧啤,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出启上,到底是詐尸還是另有隱情邢隧,我是刑警寧澤,帶...
    沈念sama閱讀 35,635評論 5 345
  • 正文 年R本政府宣布冈在,位于F島的核電站倒慧,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜纫谅,卻給世界環(huán)境...
    茶點故事閱讀 41,237評論 3 329
  • 文/蒙蒙 一炫贤、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧付秕,春花似錦兰珍、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,855評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至猛计,卻和暖如春唠摹,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背有滑。 一陣腳步聲響...
    開封第一講書人閱讀 32,983評論 1 269
  • 我被黑心中介騙來泰國打工跃闹, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人毛好。 一個月前我還...
    沈念sama閱讀 48,048評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像苛秕,于是被迫代替她去往敵國和親肌访。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,864評論 2 354