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