您好,登錄后才能下訂單哦!
今天就跟大家聊聊有關(guān)String、StringBuffer與StringBuilder三者的區(qū)別,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結(jié)了以下內(nèi)容,希望大家根據(jù)這篇文章可以有所收獲。
概念:
String是C++、java等編程語(yǔ)言中的字符串。 在java、C#中,String類是不可變的,對(duì)String類的任何改變,都是返回一個(gè)新的String類對(duì)象。 String 對(duì)象是 System.Char 對(duì)象的有序集合,用于表示字符串。String 對(duì)象的值是該有序集合的內(nèi)容,并且該值是不可變的。
StringBuffer是字符串變量,它的對(duì)象是可以擴(kuò)充和修改的。StringBuffer對(duì)象的初始化不像String類的初始化一樣,Java提供的有特殊的語(yǔ)法,而通常情況下一般使用構(gòu)造方法進(jìn)行初始化。
StringBuilder是一個(gè)可變的字符序列。此類提供一個(gè)與 StringBuffer 兼容的 API,但不保證同步。該類被設(shè)計(jì)用作 StringBuffer 的一個(gè)簡(jiǎn)易替換,用在字符串緩沖區(qū)被單個(gè)線程使用的時(shí)候。
三者都是用來(lái)對(duì)字符串進(jìn)行操作,String通常用來(lái)定義一個(gè)變量,而StringBuilder StringBuffer則通常用來(lái)對(duì)字符串進(jìn)行拼接等操作。但其實(shí)String同樣的可以用來(lái)拼接字符串,可我們?yōu)槭裁春苌偈褂媚?,這樣從三者的底層代碼說(shuō)起。
String的底層代碼為一個(gè)用final修飾的char數(shù)組,這意味著定義一個(gè)String變量以后,該變量的內(nèi)容是不可變的。
StringBuilder 與StringBuffer都繼承自AbstractStringBuilder,該類的char數(shù)組并沒(méi)有用final修飾,內(nèi)容是可變的,這個(gè)是什么意思呢。
比如:
String s1= "a"; String s2 = new String("b") ; String s3 = s1+s2;
如果這樣,我們得到“ab”這個(gè)字符串,因?yàn)镾tring底層未不可變的字符串,所以會(huì)創(chuàng)建三個(gè)對(duì)象,都會(huì)占用內(nèi)存,而這三個(gè)對(duì)象一直都未失去引用,所以jvm無(wú)法垃圾回收,造成內(nèi)存資源的大量浪費(fèi),這在我們開(kāi)發(fā)中是不推崇的,而StringBuilder 與StringBuffer則不存在這樣的問(wèn)題。
通過(guò)底層代碼我們可以看到StringBuilder 與StringBuffer在拼接字符串時(shí),通過(guò)判斷字符串長(zhǎng)度是否足夠,從而創(chuàng)建一個(gè)新的數(shù)組用來(lái)封裝數(shù)據(jù),而原來(lái)的對(duì)象被放棄引用,等待垃圾回收,從而減少內(nèi)存的浪費(fèi),因此在拼接字符串等操作時(shí),我們通常使用StringBuilder 與StringBuffer,但兩者在執(zhí)行效率上又有不同,StringBuilder的執(zhí)行效率較高,這是為什么呢?
通過(guò)底層源碼,可以發(fā)現(xiàn)StringBuffer在拼接字符串時(shí),使用了同步鎖,安全性提高,而StringBuilder未使用同步鎖,故效率提高。
看完上述內(nèi)容,你們對(duì)String、StringBuffer與StringBuilder三者的區(qū)別有進(jìn)一步的了解嗎?如果還想了解更多相關(guān)內(nèi)容,歡迎關(guān)注億速云行業(yè)資訊頻道,感謝各位的閱讀。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。