在JAVA中字串的表示有三種方式
String
StringBuilder
StringBuffer
。
關於String 需要注意兩點:
1.String是不可變的字串
,它的底層是一個用final修飾的字元陣列
2.String 物件賦值之後就會在字串常量池中快取
,如果下次建立會判定常量池是否已經有快取物件,如果有的話直接返回該引用給建立者。
什麼是字串常量池?
Java中的字串常量池(String Pool)是Java堆記憶體中的一片記憶體空間。
我們知道String是java中比較特殊的類,我們可以使用new運算子建立String物件,也可以用雙引號(”“)建立字串物件,看下圖:
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”;
底層是這樣的:
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影片教程部分評價: