String s = "hello ";
s += "world";
這兩行代碼執行后,原始的String對象中的內容沒有變,在這段代碼中,s原先指向一個String對象,內容是hello,然后執行+操作,這時,s不指向原來那個對象了,而指向了另一個String對象,內容為hello world,原來那個對象還存在於內存之中,只是s這個引用變量不再指向它了,而用關鍵字new調用構造器,總是會創建一個新的對象,無論內容是否相同。
可變性
簡單來說,String類中使用final關鍵字修飾字符數組來保存字符串,所以String對象是不可變的。而StringBuffer和StringBuilder都繼承了AbstractStringBuilder類,在AbstractStringBuilder中沒有使用final關鍵字修飾,所以這兩種對象都是可變的。
線程安全性
String中的對象是不可變的,也就可以理解為常量,線程安全。StringBuffer對方法加了同步鎖或者對調用的方法加了同步鎖,所以是線程安全的。StringBuilder並沒有對方法進行加同步鎖,所以是非線程安全的。
性能
每次對String對象進行改變的時候,都會生成一個新的String對象,然后將指針指向新的String對象。StringBuffer每次都會對StringBuffer對象本身進行操作,而不是生成新的對象並改變對象引用。相同情況下使用StringBuilder相比使用StringBuffer僅能提升10%-15%左右的性能提升,但卻要冒多線程不安全的風險。
總結:
1、操作少量的數據,使用String
2、單線程操作字符串緩沖區下操作大量數據,使用StringBuilder
3、多線程操作字符串緩沖區下操作大量數據,使用StringBuffer