java中String StringBuffer和StringBuilder的區(qū)別詳解
從聲明定義上來談

只有String 可以 直接聲明創(chuàng)建
而 StringBuffer 與 StringBuilder 必須去new對象
這是因為只有String會在這種聲明方式下去字符串常量池創(chuàng)建,其他則沒有
StringBuffer stf = new StringBuffer("abc");
StringBuilder stb = new StringBuilder("abc");StringBuffer 和 StringBuilder 都繼承自抽象類AbstractStringBuilder
從結(jié)構(gòu)上來談
String一旦創(chuàng)建,就是固定不可變的 , 而StringBuffer與StringBuilder又被稱為長度可變的字符串 , 那為什么 這兩個就長度是可變的呢?
字符串的底層都是char[]數(shù)組,所以我們直接來看 jdk 源碼
![]()
String

StringBuffer

StringBuilder
可以發(fā)現(xiàn),只有string底層的char[] 數(shù)組是加了final關(guān)鍵字修飾的 , 這意味著它是一個常量,我們一旦在構(gòu)造方法中給定值之后,那么它就是不可變的了
但是StingBuffer和StringBuilder底層數(shù)組沒有加final修飾,這就意味著它是可修改的,例,如下
StringBuffer stf = new StringBuffer("abc");
StringBuffer s = stf.append(stf);我們使用append()方法追加改變 stf 的值 ,然后使用一個新的引用去指向它,那么stf 和 s 指向的是同一個對象嗎?
是的,因為我們僅僅改變了它底層char[]數(shù)組的值 , 這里新的引用s指向的仍然是原來的對象
從線程安全來談
線程安全問題一般存在于多線程的并發(fā)中(多個線程爭奪同一資源)
String 是線程安全的 , 因為他底層的char[]數(shù)組是final的 , 它是不可被改變的,所以也就不存在線程安全問題 ,但是因為不可變 , 我們需要頻繁創(chuàng)建新的 , 這就導(dǎo)致它的性能不是很高,所以如果操作中要去頻繁修改字符串的值,我們一般使用另外兩種
StringBuilder是線程不安全的 , 因為它是可變的, 線程之間都可以去任意修改它, 所以這之間難免會出現(xiàn)一些問題 ,所以我們一般在單線程下需要頻繁修改字符串的值時用到它
StringBuffer是線程安全的 , 雖然它也是可變的 , 但是用來操作它的每個方法里面都加了synchronized關(guān)鍵字(同步鎖), 也就是說 , 當(dāng)一個線程在對這個StringBuffer進行操作時,另外一個線程是沒有權(quán)利去操作的 , 直到上一個線程釋放鎖 ,它適用于多線程中
我們在學(xué)習(xí)StringBuffer類中的方法時,需要特別注意這個方法 : substring()
這個方法的返回值類型是String,并沒有改變原來StringBuffer對象的值 ,例 :
StringBuffer stf = new StringBuffer("abc");
String substring = stf.substring(1);
System.out.println(stf);
System.out.println(substring);輸出發(fā)現(xiàn) stf : "abc" subString : "bc" ,此時并沒有去改變StringBuffer的值
總結(jié)
到此這篇關(guān)于java中String StringBuffer和StringBuilder的區(qū)別詳解的文章就介紹到這了,更多相關(guān)java String StringBuffer和StringBuilder內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- java String、StringBuilder和StringBuffer的區(qū)別詳解
- 詳解java中String、StringBuilder、StringBuffer的區(qū)別
- Java中關(guān)于String StringBuffer StringBuilder特性深度解析
- java中String、StringBuffer與StringBuilder的區(qū)別
- Java源碼深度分析String與StringBuffer及StringBuilder詳解
- Java中String和StringBuffer及StringBuilder?有什么區(qū)別
- 詳解Java中String,StringBuffer和StringBuilder的使用
- Java StringBuffer與StringBuilder有什么區(qū)別
- Java中String、StringBuffer和StringBuilder的區(qū)別
- 一文講解Java的String、StringBuffer和StringBuilder的使用與區(qū)別
相關(guān)文章
SpringMVC前端和后端數(shù)據(jù)交互總結(jié)
本篇文章主要介紹了SpringMVC前端和后端數(shù)據(jù)交互總結(jié),具有一定的參考價值,感興趣的小伙伴們可以參考一下。2017-03-03
Java設(shè)計模式之享元模式(Flyweight Pattern)詳解
享元模式(Flyweight Pattern)是一種結(jié)構(gòu)型設(shè)計模式,旨在減少對象的數(shù)量,以節(jié)省內(nèi)存空間和提高性能,本文將詳細的給大家介紹一下Java享元模式,需要的朋友可以參考下2023-07-07
Java基礎(chǔ)教程之?dāng)?shù)組的定義與使用
Java語言的數(shù)組是一個由固定長度的特定類型元素組成的集合,它們的數(shù)據(jù)類型必須相同,聲明變量的時候,必須要指定參數(shù)類型,這篇文章主要給大家介紹了關(guān)于Java基礎(chǔ)教程之?dāng)?shù)組的定義與使用的相關(guān)資料,需要的朋友可以參考下2021-09-09
Java for循環(huán)性能優(yōu)化實現(xiàn)解析
這篇文章主要介紹了Java for循環(huán)性能優(yōu)化實現(xiàn)解析,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-01-01
java開發(fā)ServiceLoader實現(xiàn)機制及SPI應(yīng)用
這篇文章主要為大家介紹了java開發(fā)ServiceLoader實現(xiàn)機制及SPI應(yīng)用,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-10-10

