java中String,StringBuffer,StringBuilder的區別
我們簡單瞭解下這三種數據結構。
String:字符串常量(線程安全)
StringBuffer:字符串變量(線程安全)
StringBuilder:字符串變量(線程不安全)
這裏string是字符串常量,我們單個討論。我們來看看兩種聲明字符串的方式。
這兩種數據雖然相同,但是調用==判斷的時候卻不相同。因爲String a="123"的時候,直接在編譯的時候就確定好了字符
串的值。123存儲在方法區的常量池中。而String b=new String("123")是在運行的時候在堆區開闢了空間,存儲了字符串
123。如果我們添加語句b="100"。這時候是在堆區重新new了個空間,重新賦值。我們來看看String類的源碼。
string是由char[]組成的。當改變字符串的時候是在堆區重新申請地址然後賦值。
每次改變string的值的時候都是在新的地址上寫入。所以是線程安全的。
stringBuffer是字符串變量,先來看下實現源碼:
當改變Stringbuffert的值的時候是調用父類的append函數,對字符串進行改變。而且用了synchronized修飾,當多個線
程對StringBuffer的值進行操作的時候,是線程安全的。
StringBuilder也是字符串變量,實現源碼:
當改變StringBuilder的值的時候是調用父類的append函數,但是沒有用synchronized關鍵字修飾,所以線程不安全。
在對字符串改變的性能來說,StringBuilder的性能比StringBuffer稍高一些。但是性能差別不大。尤其是字符串長度較
長的時候,性能差別更小。