String是一個類,也可以表示字符串數據類型
String:是對象不是原始類型.為不可變對象,一旦被創建,就不能修改它的值.對於已經存在的String對象的修改都是重新創建一個新的對象,然后把新的值保存進去.
String 是final類,即不能被繼承.作為參數傳遞時,只是復制了一份引用
string s = "a";
s = "b";
那意思是這里是兩個對象,string s = "a";是一個對象,s = "b"; 又是1個對象,第一個對象會被垃圾回收
StringBuffer:
是一個可變對象,當對他進行修改的時候不會像String那樣重新建立對象
它只能通過構造函數來建立,
StringBuffer sb = new StringBuffer();
對象被建立以后,在內存中就會分配內存空間,並初始保存一個null.向StringBuffer中賦值的時候可以通過它的append方法.
sb.append("hello");
StringBuffer的處理步驟實際上是通過建立一個StringBuffer,然后調用append(),最后再將StringBuffer toSting(); insert方法
比較
字符串連接操作中StringBuffer的效率要比String高
String 新建對象,垃圾回收影響性能
不可變好處:
1. 只有當字符串是不可變的,字符串池才有可能實現。字符串池的實現可以在運行時節約很多heap空間,因為不同的字符串變量都指向池中的同一個字符串。但如果字符串是可變的,那么String interning將不能實現
2. 數據庫的用戶名、密碼都是以字符串的形式傳入來獲得數據庫的連接,或者在socket編程中,主機名和端口都是以字符串的形式傳入。因為字符串是不可變的,所以它的值是不可改變的,否則黑客們可以鑽到空子,改變字符串指向的對象的值,造成安全漏洞。
3. 因為字符串是不可變的,所以是多線程共享安全的,同一個字符串實例可以被多個線程共享。
4. 因為字符串是不可變的,所以在它創建的時候hashcode就被緩存了,不需要重新計算。這就使得字符串很適合作為Map中的鍵,字符串的處理速度要快過其它的鍵對象。這就是HashMap中的鍵往往都使用字符串
5.類加載器要用到字符串,不可變性提供了安全性,以便正確的類被加載。譬如你想加載java.sql.Connection類,而這個值被改成了myhacked.Connection,那么會對你的數據庫造成不可知的破壞。
壞處:影響效率,對系統性能產生影響。 特別當內存中無引用對象多了以后, JVM 的 GC 就會開始工作,那速度是一定會相當慢的
StringBuffer 和StringBuilder可變
區別
改變 StringBuffer 每次結果都會對 StringBuffer 對象本身進行操作,而不是生成新的對象,再改變對象引用。
StringBuilder類被設計用作 StringBuffer 的一個簡易替換,用在字符串緩沖區被單個線程使用的時候(這種情況很普遍)。但不保證同步。如果可能,建議優先采用該類,因為在大多數實現中,它比 StringBuffer 要快。兩者的方法基本相同。
Final關鍵字
final關鍵詞生命的域的值只能被 初始化一次,一般在構造方法中初始化,在多線程開發中,final域通常用來實現不可變對象,當對象中干的共享變量的值不可能發生變化時,在多線程中也就不需要同步來進行處理,故在多線程開發中應該盡可能使用不可變對象。另外,在代碼執行時,final域的值可以被保存在寄存器中,而不用從主存中頻繁重新讀取。