標籤:
一、不可變String類型
字串是電腦程式設計中的,最常見行為,Java的字串操作最主要的類是String,並且String對象是不可變的(Immutable),即對象一旦建立在記憶體中,那麼它的內容就不再改變。雖然String類中提供很多方法看起來像是可以修改String對象,比如trim()、subString()等等,但是實際上它們並沒有改變原來的字串對象,這些方法傳遞的只是引用的一個拷貝,所以重新建立了一個String類型的對象,並且有了新的引用。
例如下面一段代碼可以說明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,二者都提供了豐富的字串處理命令。
二、StringBuilder類型
StringBuilder類型是一個可變的字串類型,StringBuilder類型的API與StringBuffer類型的API基本一致,唯一的區別是StringBuilder的使用假設在單一線程中,換句話說,StringBuilder是線程不安全的。StringBuilder在執行個體化的時候,通常也會預設設定一個容量大小,一般為字串參數的長度+16。StringBuilder是繼承AbstractStringBuilder這個抽象類別的,而這個抽象類別的內部使用字元數組來實現的,數組可以進行動態擴充。StringBuilder類提供的常用的方法有append()、insert()、replace()、deleteCharAt()、indexOf()、reverse()、toString()等方法,可以實現字串的增刪改查等準系統。
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);}}運行結果:23erawtfos espilcE
三、StringBuffer類型
StringBuffer是一個可變的、安全執行緒的處理字串的類型。同樣,StringBuffer也是繼承AbstractStringBuilder抽象類別的,因此內部也是使用字元數組來儲存字串的。與StringBuilder的區別是,StringBuffer類型的絕大多數方法的修飾符都加上了關鍵字synchronized,包括length()、capacity()、trimToSize()、append()、delete()、insert()等等,這一方面表明StringBuffer是安全執行緒的,可以用於多線程並發的場合,所有對StringBuffer的並行作業都要按照一定的順序來執行,確保它們都能夠正確的執行;另一方面,也表明StringBuffer的開銷要比StringBuilder大一點。StringBuffer是要早於StringBuilder開發的,在單一線程中,可以使用StringBuilder來提高運行速度,如果遇到多線程需要同步時,則使用StringBuffer類型。其他的,在API的調用方面,基本上一模一樣。
Java字串的String、StringBuilder、StringBuffer三者特性詳解