String、StringBuffer和StringBuilder的區別
String
String類是不可變類,即一旦一個String物件被建立以後,包含在這個物件中的字元序列是不可改變的,直至這個物件被銷燬
String a="asd"; a="fgh";
在這裡,再次給a賦值時,並不是對原來堆中例項物件進行重新賦值,而是生成一個新的例項物件,並且指向“456”這個字串,a則指向最新生成的例項物件,之前的例項物件仍然存在,如果沒有被再次引用,則會被垃圾回收,所以,Java中對String物件進行的操作實際上是一個不斷建立新的物件並且將舊的物件回收的一個過程,所以執行速度很慢
StringBuffer
StringBuffer物件則代表一個字元序列可變的字串,是執行緒安全的,當一個StringBuffer被建立以後,通過StringBuffer提供的append()、insert()、reverse()、setCharAt()、setLength()等方法可以改變這個字串物件的字元序列。一旦通過StringBuffer生成了最終想要的字串,就可以呼叫它的toString()方法將其轉換為一個String物件.
構造方法可以構造一個空的字串緩衝區,並且初始化為 16 個字元的容量,當然也可以自定義
StringBuffer A = new StringBuffer("asd"); 則有3+16個字元的容量
StringBuffer類中的方法都添加了synchronized關鍵字,也就是給這個方法添加了一個鎖,用來保證執行緒安全,如下:
@Override public synchronized StringBuffer append(Object obj) { toStringCache = null; super.append(String.valueOf(obj));return this; } @Override @HotSpotIntrinsicCandidate public synchronized StringBuffer append(String str) { toStringCache = null; super.append(str); return this; }
StringBuilder
StringBuilder類也代表可變字串物件。實際上,StringBuilder和StringBuffer基本相似,兩個類的構造器和方法也基本相同。不同的是:StringBuffer是執行緒安全
區別
執行速度,或者說是執行速度,在這方面執行速度快慢為:StringBuilder > StringBuffer > String
String最慢的原因:
String為字串常量,而StringBuilder和StringBuffer均為字串變數,即String物件一旦建立之後該物件是不可更改的,但後兩者的物件是變數,是可以更改的
String:適用於少量的字串操作的情況
適用場景:
StringBuilder:適用於單執行緒下在字元緩衝區進行大量操作的情況
StringBuffer:適用多執行緒下在字元緩衝區進行大量操作的情況
原文連結:https://blog.csdn.net/csxypr/java/article/details/92378336