在JAVA中字串的表示有三種方式

String

StringBuilder

StringBuffer

關於String 需要注意兩點:

1.String是不可變的字串

,它的底層是一個用final修飾的字元陣列

String,StringBuilder,StringBuffer的區別

2.String 物件賦值之後就會在字串常量池中快取

,如果下次建立會判定常量池是否已經有快取物件,如果有的話直接返回該引用給建立者。

什麼是字串常量池?

Java中的字串常量池(String Pool)是Java堆記憶體中的一片記憶體空間。

我們知道String是java中比較特殊的類,我們可以使用new運算子建立String物件,也可以用雙引號(”“)建立字串物件,看下圖:

String,StringBuilder,StringBuffer的區別

String s1 = “Cat”當我們用這種方式建立字串物件的時候,首先會去字串常量池中查詢看有沒有“Cat”字串,如果有則返回它的地址給s1,如果沒有則在常量池中建立“Cat”字串,並將地址返回給s1。

String s3 = new String(“Cat”)當我們用這種方式建立字串物件的時候,首先會去字串常量池中查詢看有沒有“Cat”字串,如果沒有則在常量池中建立“Cat”字串,然後在堆記憶體中建立“Cat”字串,並將堆記憶體中的地址返回給s3。

所以結果 s1 == s2 為true s1==s3為false,s1和s2都指向了常量池中的“Cat”而s3指向了堆記憶體中的“Cat”

大家想想 如果有這麼一行程式碼 String str = new String(“hello”)

在記憶體中會建立幾個字串物件?

答案是一個或兩個

如果常量池中已經存在“hello”,則會在堆記憶體中建立一個“hello”物件,如果常量池中不存在則在常量池中建立一個,在堆記憶體中建立一個

透過引入字串常量池的概念,讓字串處理的效率得到了提高,這是jvm對字串的一種最佳化手段。

當我們做拼接字串操作的時候:

String str = “you”;

Str = str+”win”;

底層是這樣的:

String,StringBuilder,StringBuffer的區別

Str剛開始指向常量池中的“you”,拼接字串“win”的時候又開闢了兩塊塊記憶體空間一塊儲存“win”,一塊儲存拼接以後生成的字串“ you win”並且str指向拼接以後的字串,在這個過程中一共佔用了三塊記憶體空間,所以效率是非常低下的。

StringBuilder 和 StringBuffer都繼承於:AbstractStringBuilder

他們的底層使用的是沒有用final修飾的字元陣列:char[]

abstract class

AbstractStringBuilder

implements

Appendable, CharSequence {

/**

* The value is used for character storage。

*/

char

[]

value

所以在做字串拼接的時候就在原來的記憶體上進行拼接,不會浪費記憶體空間。

StringBuilder和StringBuffer的區別是

StringBuilder是執行緒不安全的,它的執行效率比StriingBuffer要高

StringBuffer是執行緒安全的,它的執行效率比StringBuilder要低

總結:

1.String字串是不可變的。

2.在修改字串操作比較多的時候用StringBuilder或StringBuffer.

在要求執行緒安全的情況下用StringBuffer

在不要求執行緒安全的情況下用StringBuilder

最後再送你兩句話:

1:學習貴在堅持,有付出就會有收穫

2:看到有幫助的回答一定記得點個贊,以後在動態隨時能檢視到回答,不怕找不到了

另外我給你準備了一套最通俗易懂的Java的影片教程,涵蓋了零基礎到就業的所有內容

關注公眾號“極簡程式設計”觀看。

java影片教程部分評價:

String,StringBuilder,StringBuffer的區別