圖析:String,StringBuffer與StringBuilder的區(qū)別

一辱揭、Java String 類——String字符串常量

字符串廣泛應(yīng)用 在Java 編程中汪诉,在 Java 中字符串屬于對(duì)****象讼稚,Java 提供了String 類來(lái)****創(chuàng)建****和****操作****字符串舅踪。

需要注意的是,String的值是不可變的选侨,這就導(dǎo)致每次對(duì)String的操作都會(huì)生成新的String對(duì)象掖鱼,這樣不僅效率低下,而且大量浪費(fèi)有限的內(nèi)存空間援制。我們來(lái)看一下這張對(duì)String操作時(shí)內(nèi)存變化的圖:

image
image.gif

?

我們可以看到戏挡,初始String值為“hello”,然后在這個(gè)字符串后面加上新的字符串“world”晨仑,這個(gè)過(guò)程是需要重新在棧堆內(nèi)存中開(kāi)辟內(nèi)存空間的褐墅,最終得到了“hello world”字符串也相應(yīng)的需要開(kāi)辟內(nèi)存空間拆檬,這樣短短的兩個(gè)字符串,卻需要開(kāi)辟三次內(nèi)存空間妥凳,不得不說(shuō)這是對(duì)內(nèi)存空間的極大浪費(fèi)竟贯。為了應(yīng)對(duì)經(jīng)常性的字符串相關(guān)的操作,谷歌引入了兩個(gè)新的類——StringBuffer類和StringBuild類來(lái)對(duì)此種變化字符串進(jìn)行處理逝钥。

二澄耍、StringBuffer 和 StringBuilder 類——StringBuffer、StringBuilder字符串變量

**
image
image.gif

?**

當(dāng)對(duì)字符串進(jìn)行修改的時(shí)候晌缘,需要使用 StringBuffer 和 StringBuilder 類。

和 String 類不同的是痢站,StringBuffer 和 StringBuilder 類的對(duì)象能夠被多次的修改磷箕,并且不產(chǎn)生新的未使用對(duì)象。

StringBuilder 類在 Java 5 中被提出阵难,它和 StringBuffer 之間的最大不同在于 StringBuilder 的方法不是線程安全的(不能同步訪問(wèn))岳枷。

由于 StringBuilder 相較于 StringBuffer 有速度優(yōu)勢(shì),所以多數(shù)情況下建議使用 StringBuilder 類呜叫。然而在應(yīng)用程序要求線程安全的情況下空繁,則必須使用 StringBuffer 類。

三者的繼承結(jié)構(gòu)

**
image
image.gif

?**

三者的區(qū)別

(1)字符修改上的區(qū)別(主要)

String:不可變字符串朱庆;

StringBuffer:可變字符串盛泡、效率低、線程安全娱颊;

StringBuilder:可變字符序列傲诵、效率高、線程不安全箱硕;

(2)初始化上的區(qū)別拴竹,****String可以空賦值,后者不行剧罩,報(bào)錯(cuò)

①String

StringBuffer s = null;   

StringBuffer s = “abc”;   

②StringBuffer

StringBuffer s = null; //結(jié)果警告:Null pointer access: The variable result can only be null at this location

StringBuffer s = new StringBuffer();//StringBuffer對(duì)象是一個(gè)空的對(duì)象

StringBuffer s = new StringBuffer(“abc”);//創(chuàng)建帶有內(nèi)容的StringBuffer對(duì)象,對(duì)象的內(nèi)容就是字符串”
image.gif

小結(jié):(1)如果要操作少量的數(shù)據(jù)用 String栓拜;

(2)多線程操作字符串緩沖區(qū)下操作大量數(shù)據(jù) StringBuffer;

(3)單線程操作字符串緩沖區(qū)下操作大量數(shù)據(jù) StringBuilder(推薦使用)惠昔。

三幕与、StringBuilder類在Android中運(yùn)用示例

(1)上官方文檔,StringBuilder舰罚,A mutable sequence of characters. This class provides an API compatible with StringBuffer, but with no guarantee of synchronization. This class is designed for use as a drop-in replacement for StringBuffer in places where the string buffer was being used by a single thread (as is generally the case). Where possible, it is recommended that this class be used in preference to StringBuffer as it will be faster under most implementations.

The principal operations on a StringBuilder are theappend and insert methods, which are overloaded so as to accept data of any type. Each effectively converts a given datum to a string and then appends or inserts the characters of that string to the string builder. The append method always adds these characters atthe end of the builder; the insert method adds the characters at a specified point.

參考網(wǎng)址:<u>https://developer.android.google.cn/reference/java/lang/StringBuilder.html</u>

由上面的官方文檔纽门,我們知道以下幾點(diǎn):

一個(gè)可變的字符序列。StringBuilder類提供一個(gè)與StringBuffer兼容的API营罢,但不保證同步赏陵。該類被設(shè)計(jì)用作StringBuffer的一個(gè)簡(jiǎn)單替換饼齿,用在字符串緩沖區(qū)被單個(gè)線程使用的時(shí)候(這種情況很普遍)。如果可能蝙搔,建議優(yōu)先采用該類缕溉,因?yàn)樵诖蠖鄶?shù)實(shí)現(xiàn)種,它比StringBuffer要快吃型。

在StringBuilder上的主要操作時(shí)append和insert方法证鸥,可重載這些方法,以接收任意類型的數(shù)據(jù)勤晚。每個(gè)方法都能有效地將給定的數(shù)據(jù)轉(zhuǎn)換成字符串枉层,然后將該字符串的字符追加或插入到字符串生成器中,append方法始終將這些字符添加到生成器的末端赐写,而insert方法則在指定的點(diǎn)添加字符鸟蜡。

例如,如果z引用一個(gè)當(dāng)前內(nèi)容為“start”的字符串的生成器對(duì)象挺邀,則該方法調(diào)用z.append("le")將使字符串生成器包含“startle”揉忘,而z.insert(4,"le")將更改字符串生成器,使之包含“startlet”端铛。

通常泣矛,如果sb引用StringBuilder的實(shí)例,則sb.append(x)和sb.insert(sb.length(),x)具有相同的效果。每個(gè)字符串生成器都有一定的容量禾蚕,只要字符串生成器包含的字符序列的長(zhǎng)度沒(méi)有超出此容量您朽,就無(wú)需分配新的內(nèi)容緩沖區(qū)。如果內(nèi)容緩沖區(qū)溢出夕膀,則此容量自動(dòng)增大虚倒。

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

(2)上代碼,具體實(shí)現(xiàn)

new Thread(new Runnable){
    @Override
        public void run(){
        HttpURLConnection connection = null;
        BufferedReader reader = null;
        try{
                URL url = new URL("http://www.baidu.com");
                connection = (HttpURLConnection)url.openConnection();
                connnection.setRequestMethod("GET");
                InputStream in = connection.getInputStream();
                //下面對(duì)獲取到的輸入流進(jìn)行讀取
                reader= new BufferedReader(new InputStreamReader(in));
                StringBuilder response = new(StringBuilder());
                String line;
                While ((line =reader.readLine())!= null ){
                    response.appen    d(line));
                }
            showResponse(reponse.toString())
        }
    }......

}
image.gif

上段代碼模擬的是向百度網(wǎng)請(qǐng)求數(shù)據(jù)易猫,然后對(duì)網(wǎng)站返回的數(shù)據(jù)流進(jìn)行讀取耻煤,最終應(yīng)用StringBuilder()進(jìn)行字符串?dāng)?shù)據(jù)的讀取和顯示。

總結(jié):末尾總是有福利准颓,三者區(qū)別可參照下表:

image.png

說(shuō)明:博主博客會(huì)同步發(fā)布到CSDN哈蝇,歡迎閱讀

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市攘已,隨后出現(xiàn)的幾起案子炮赦,更是在濱河造成了極大的恐慌,老刑警劉巖样勃,帶你破解...
    沈念sama閱讀 218,284評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件吠勘,死亡現(xiàn)場(chǎng)離奇詭異性芬,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)剧防,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,115評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)植锉,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人峭拘,你說(shuō)我怎么就攤上這事俊庇。” “怎么了鸡挠?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,614評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵辉饱,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我拣展,道長(zhǎng)鞋囊,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,671評(píng)論 1 293
  • 正文 為了忘掉前任瞎惫,我火速辦了婚禮,結(jié)果婚禮上译株,老公的妹妹穿的比我還像新娘瓜喇。我一直安慰自己,他們只是感情好歉糜,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,699評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布乘寒。 她就那樣靜靜地躺著,像睡著了一般匪补。 火紅的嫁衣襯著肌膚如雪伞辛。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,562評(píng)論 1 305
  • 那天夯缺,我揣著相機(jī)與錄音蚤氏,去河邊找鬼。 笑死踊兜,一個(gè)胖子當(dāng)著我的面吹牛竿滨,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播捏境,決...
    沈念sama閱讀 40,309評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼于游,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了垫言?” 一聲冷哼從身側(cè)響起贰剥,我...
    開(kāi)封第一講書(shū)人閱讀 39,223評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎筷频,沒(méi)想到半個(gè)月后蚌成,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體前痘,經(jīng)...
    沈念sama閱讀 45,668評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,859評(píng)論 3 336
  • 正文 我和宋清朗相戀三年笑陈,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了际度。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,981評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡涵妥,死狀恐怖乖菱,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情蓬网,我是刑警寧澤窒所,帶...
    沈念sama閱讀 35,705評(píng)論 5 347
  • 正文 年R本政府宣布,位于F島的核電站帆锋,受9級(jí)特大地震影響吵取,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜锯厢,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,310評(píng)論 3 330
  • 文/蒙蒙 一皮官、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧实辑,春花似錦捺氢、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,904評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至残黑,卻和暖如春馍佑,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背梨水。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,023評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工拭荤, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人疫诽。 一個(gè)月前我還...
    沈念sama閱讀 48,146評(píng)論 3 370
  • 正文 我出身青樓穷劈,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親踊沸。 傳聞我的和親對(duì)象是個(gè)殘疾皇子歇终,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,933評(píng)論 2 355

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