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 |
---|---|
線程安全 | 線程不安全 |
爲了保證線程安全,則會導致效率低 | 效率高(單線程時兩個效率都很高) |