Java 中String StringBuilder 與 StringBuffer詳解及用法實(shí)例
在A(yíng)ndroid/Java開(kāi)發(fā)中,用來(lái)處理字符串常用的類(lèi)有3種: String、StringBuilder、StringBuffer。
它們的異同點(diǎn):
1) 都是 final 類(lèi), 都不允許被繼承;
2) String 長(zhǎng)度是不可變的, StringBuffer、StringBuilder 長(zhǎng)度是可變的;
3) StringBuffer 是線(xiàn)程安全的, StringBuilder 不是線(xiàn)程安全的。
String VS StringBuffer
String 類(lèi)型和StringBuffer的主要性能區(qū)別:String是不可變的對(duì)象, 因此在每次對(duì)String 類(lèi)型進(jìn)行改變的時(shí)候,都會(huì)生成一個(gè)新的 String 對(duì)象,然后將指針指向新的 String 對(duì)象,所以經(jīng)常改變內(nèi)容的字符串最好不要用 String ,因?yàn)槊看紊蓪?duì)象都會(huì)對(duì)系統(tǒng)性能產(chǎn)生影響,特別當(dāng)內(nèi)存中無(wú)引用對(duì)象多了以后, JVM 的 GC 就會(huì)開(kāi)始工作,性能就會(huì)降低。
使用 StringBuffer 類(lèi)時(shí),每次都會(huì)對(duì) StringBuffer 對(duì)象本身進(jìn)行操作,而不是生成新的對(duì)象并改變對(duì)象引用。所以多數(shù)情況下推薦使用 StringBuffer ,特別是字符串對(duì)象經(jīng)常改變的情況下。
在某些特別情況下, String 對(duì)象的字符串拼接其實(shí)是被 Java Compiler 編譯成了 StringBuffer 對(duì)象的拼接,所以這些時(shí)候 String 對(duì)象的速度并不會(huì)比 StringBuffer 對(duì)象慢,例如:
String s1 = “This is only a” + “ simple” + “ test”; StringBuffer Sb = new StringBuilder(“This is only a”).append(“ simple”).append(“ test”);
生成 String s1對(duì)象的速度并不比 StringBuffer慢。其實(shí)在Java Compiler里,自動(dòng)做了如下轉(zhuǎn)換:
Java Compiler直接把上述第一條語(yǔ)句編譯為:
String s2 = “This is only a”; String s3 = “ simple”; String s4 = “ test”; String s1 = s2 + s3 + s4;
這時(shí)候,Java Compiler會(huì)規(guī)規(guī)矩矩的按照原來(lái)的方式去做,String的concatenation(即+)操作利用了StringBuilder(或StringBuffer)的append方法實(shí)現(xiàn),此時(shí),對(duì)于上述情況,若s2,s3,s4采用String定義,拼接時(shí)需要額外創(chuàng)建一個(gè)StringBuffer(或StringBuilder),之后將StringBuffer轉(zhuǎn)換為String;若采用StringBuffer(或StringBuilder),則不需額外創(chuàng)建StringBuffer。
StringBuilder
StringBuilder是5.0新增的。此類(lèi)提供一個(gè)與 StringBuffer 兼容的 API,但不保證同步。該類(lèi)被設(shè)計(jì)用作 StringBuffer 的一個(gè)簡(jiǎn)易替換,用在字符串緩沖區(qū)被單個(gè)線(xiàn)程使用的時(shí)候(這種情況很普遍)。如果可能,建議優(yōu)先采用該類(lèi),因?yàn)樵诖蠖鄶?shù)實(shí)現(xiàn)中,它比 StringBuffer 要快。兩者的方法基本相同。
使用策略
1) 基本原則:如果要操作少量的數(shù)據(jù),用String ;單線(xiàn)程操作大量數(shù)據(jù),用StringBuilder ;多線(xiàn)程操作大量數(shù)據(jù),用StringBuffer。
2) 不要使用String類(lèi)的”+”來(lái)進(jìn)行頻繁的拼接,因?yàn)槟菢拥男阅軜O差的,應(yīng)該使用StringBuffer或StringBuilder類(lèi),這在Java的優(yōu)化上是一條比較重要的原則。例如:
String result = "";
for (String s : hugeArray) {
result = result + s;
}
// 使用StringBuilder
StringBuilder sb = new StringBuilder();
for (String s : hugeArray) {
sb.append(s);
}
String result = sb.toString();
當(dāng)出現(xiàn)上面的情況時(shí),顯然我們要采用第二種方法,因?yàn)榈谝环N方法,每次循環(huán)都會(huì)創(chuàng)建一個(gè)String result用于保存結(jié)果,除此之外二者基本相同.
3) StringBuilder一般使用在方法內(nèi)部來(lái)完成類(lèi)似”+”功能,因?yàn)槭蔷€(xiàn)程不安全的,所以用完以后可以丟棄。StringBuffer主要用在全局變量中。
4) 相同情況下使用 StirngBuilder 相比使用 StringBuffer 僅能獲得 10%~15% 左右的性能提升,但卻要冒多線(xiàn)程不安全的風(fēng)險(xiǎn)。而在現(xiàn)實(shí)的模塊化編程中,負(fù)責(zé)某一模塊的程序員不一定能清晰地判斷該模塊是否會(huì)放入多線(xiàn)程的環(huán)境中運(yùn)行,因此:除非確定系統(tǒng)的瓶頸是在 StringBuffer 上,并且確定你的模塊不會(huì)運(yùn)行在多線(xiàn)程模式下,才可以采用StringBuilder;否則還是用StringBuffer。
感謝閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持!
- Java源碼深度分析String與StringBuffer及StringBuilder詳解
- java中String StringBuffer和StringBuilder的區(qū)別詳解
- java中String、StringBuffer與StringBuilder的區(qū)別
- java String、StringBuilder和StringBuffer的區(qū)別詳解
- java 中String和StringBuffer與StringBuilder的區(qū)別及使用方法
- Java 中 String,StringBuffer 和 StringBuilder 的區(qū)別及用法
- 詳解Java中String,StringBuffer和StringBuilder的使用
相關(guān)文章
Spring Batch遠(yuǎn)程分區(qū)的本地Jar包模式的代碼詳解
這篇文章主要介紹了Spring Batch遠(yuǎn)程分區(qū)的本地Jar包模式,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-09-09
Redis緩存及熱點(diǎn)key問(wèn)題解決方案
這篇文章主要介紹了Redis緩存及熱點(diǎn)key問(wèn)題解決方案,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-04-04
java 線(xiàn)程創(chuàng)建多線(xiàn)程詳解
本文主要講解java 線(xiàn)程創(chuàng)建多線(xiàn)程的知識(shí),這里對(duì)java線(xiàn)程的創(chuàng)建做了詳細(xì)介紹,并附簡(jiǎn)單示例代碼,有興趣的小伙伴可以參考下2016-09-09
MyBatis入門(mén)學(xué)習(xí)教程(一)-MyBatis快速入門(mén)
MyBatis是一個(gè)支持普通SQL查詢(xún),存儲(chǔ)過(guò)程和高級(jí)映射的優(yōu)秀持久層框架,這篇文章主要給大家分享MyBatis入門(mén)學(xué)習(xí)教程(一)-MyBatis快速入門(mén),需要的朋友可以參考下2015-08-08
SpringBoot2零基礎(chǔ)到精通之自動(dòng)配置底層分析及小技巧
SpringBoot是一種整合Spring技術(shù)棧的方式(或者說(shuō)是框架),同時(shí)也是簡(jiǎn)化Spring的一種快速開(kāi)發(fā)的腳手架,本篇讓我們一起學(xué)習(xí)自動(dòng)配置的底層分析與一些開(kāi)發(fā)中的小技巧2022-03-03
JAVA多線(xiàn)程進(jìn)階方式(Runnable接口的講解和運(yùn)用)
這篇文章主要介紹了JAVA多線(xiàn)程進(jìn)階方式(Runnable接口的講解和運(yùn)用),具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-01-01
java web實(shí)現(xiàn)簡(jiǎn)易收費(fèi)站
這篇文章主要為大家詳細(xì)介紹了java web實(shí)現(xiàn)簡(jiǎn)易收費(fèi)站,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一2020-11-11
Java中Collections.sort()排序方法舉例詳解
很多時(shí)候都需要對(duì)一些數(shù)據(jù)進(jìn)行排序的操作,這篇文章主要給大家介紹了關(guān)于Java中Collections.sort()方法舉例詳解的相關(guān)資料,使用Collections.sort()可以使用其sort()方法來(lái)對(duì)List、Set等集合進(jìn)行排序,需要的朋友可以參考下2024-02-02
idea如何debug看springsecurity的過(guò)濾器順序
這篇文章主要介紹了idea如何debug看springsecurity的過(guò)濾器順序,文中通過(guò)圖文結(jié)合的方式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下2024-04-04

