字符串有關的一些知識補充

1 String常量(字符常量)

只有使用雙引號直接創建的字符串,例如String str=“aaa” ,與new出來的字符串相比,new出來的必須在堆中分配新的空間,當一個字符串重新new時,原來的空間會被gc回收。而字符常量存放在常量池中,重新賦值後原來的空間不會被回收

2 字符串的常量池

  • 常量池是除了棧和堆以外的存儲空間
  • 常量池中的值不會被gc回收
  • 多次出現的相同字符常量只會在常量池中創建一個String對象,即創建一個字符常量時先判斷常量池中是否含有該值,如果有則直接指向常量池中的值,如果沒有則在常量池中創建新的

3 字符串的不變性

字符串的值一旦確定,則不可修改。當一個字符串重新賦值時會在內存中再分配一塊空間,然後這個字符串指向新的這個空間。原來的值實際上還存在,相當於重新賦值後就有兩個字符串了。而其他變量,例如int類型的變量,重新賦值相當於是在原有基礎上覆蓋新的內容
由於String是不可變的,如果大量修改字符串的話會在內存中產生許多垃圾對象。所以String不建議頻繁修改,查看源碼可以看出String類中提供了許多方法,但沒有“增刪改”等操作的方法,大多數都是查操作。

4 StringBuffer和StringBuilder

4.1 用途

如果需要頻繁對字符串進行修改操作,建議使用StringBuffer和StringBuilder。它們是可變字符串,兩類的用法類似

4.2 常用方法

方法名 作用
append() 在字符串之後追加新的字符,參數爲追加的字符並且可以是很多類型。使用此方法不會在堆中重新開闢新的空間,而是在原來的空間後追加字符
insert() 在字符串中間插入新的字符,第一個參數爲插入的位置,第二個參數爲插入的字符並且可以是很多類型
delete(int start, int end) 刪除字符串中指定位置的字符,刪除索引爲[start, end)位置的字符
deleteCharAt(int index) 刪除指定位置的單個字符
setCharAt(int index, char ch) 將指定位置的字符修改爲爲新的字符
setLength(int newLength) 將字符串保留指定長度的字符,相當於字符串爲(0,newLength)
reverse() 倒序字符串
toString() 將StringBuffer對象變爲String對象

4.3 區別

StringBuffer StringBuilder
線程安全 線程不安全
爲了保證線程安全,則會導致效率低 效率高(單線程時兩個效率都很高)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章