Java字符串的String、StringBuilder、StringBuffer三者特性詳解

1、不可變String類型

字符串是計算機程序設計中的,最多見行爲,Java的字符串操做最主要的類是String,而且String對象是不可變的(Immutable),即對象一旦建立在內存中,那麼它的內容就再也不改變。雖然String類中提供不少方法看起來像是能夠修改String對象,好比trim()、subString()等等,可是實際上它們並無改變原來的字符串對象,這些方法傳遞的只是引用的一個拷貝,因此從新建立了一個String類型的對象,而且有了新的引用。 java

例以下面一段代碼能夠說明String的不可變特性: 數組


package date0804.demo2;
 
 
public class ImmutableString {
 
    public static void main(String[] args){
         
        String str=new String("xyz");
        change(str);
        System.out.println(str);
    }
     
    public static void change(String s) {
        s="xml";
    }
}



其輸出結果爲


str=xyz 安全

所以,我麼能夠看到每當把String對象做爲方法的參數時,都會複製一份引用,而該引用所指的對象其實一直待在單一的物理位置上,從未改變過。 多線程

另外,String對象還支持+操做符,+操做符能夠合併字符串,可是根據相關的研究發現,使用+操做符來鏈接字符串會使得效率降低,於是,涉及到字符串的更改時,優先使用下面的StringBuilder或StringBuffer,兩者都提供了豐富的字符串處理命令。 併發

2、StringBuilder類型

StringBuilder類型是一個可變的字符串類型,StringBuilder類型的API與StringBuffer類型的API基本一致,惟一的區別是StringBuilder的使用假設在單一線程中,換句話說,StringBuilder是線程不安全的。StringBuilder在實例化的時候,一般也會默認設定一個容量大小,通常爲字符串參數的長度+16。StringBuilder是繼承AbstractStringBuilder這個抽象類的,而這個抽象類的內部使用字符數組來實現的,數組能夠進行動態擴展。StringBuilder類提供的經常使用的方法有append()、insert()、replace()、deleteCharAt()、indexOf()、reverse()、toString()等方法,能夠實現字符串的增刪改查等基本功能。 app


package date0812.demo1;

public class Test3 {

	public static void main(String[] args) {
		StringBuilder stringBuilder = new StringBuilder("Eclipse");
		//添加
		stringBuilder = stringBuilder.append(" software");
		//容量
		int C = stringBuilder.capacity();
		//翻轉
		stringBuilder= stringBuilder.reverse();
		System.out.println(C);
		System.out.println(stringBuilder);
	}
}


運行結果:
23
erawtfos espilcE



3、StringBuffer類型

StringBuffer是一個可變的、線程安全的處理字符串的類型。一樣,StringBuffer也是繼承AbstractStringBuilder抽象類的,所以內部也是使用字符數組來存儲字符串的。與StringBuilder的區別是,StringBuffer類型的絕大多數方法的修飾符都加上了關鍵字synchronized,包括length()、capacity()、trimToSize()、append()、delete()、insert()等等,這一方面代表StringBuffer是線程安全的,能夠用於多線程併發的場合,全部對StringBuffer的併發操做都要按照必定的順序來執行,確保它們都可以正確的執行;另外一方面,也代表StringBuffer的開銷要比StringBuilder大一點。StringBuffer是要早於StringBuilder開發的,在單一線程中,可使用StringBuilder來提升運行速度,若是遇到多線程須要同步時,則使用StringBuffer類型。其餘的,在API的調用方面,基本上如出一轍。 ui

相關文章
相關標籤/搜索