簡介: 數組
String和StringBuffer均可以存儲和操做字符串,即包含多個字符的字符串數據。他們的區別就是String類是字符串常量,是不可更改的常量。而StringBuffer是字符串變量,它的對象是能夠擴充和修改的。簡要的說, String 類型和 StringBuffer 類型的主要性能區別其實在於 String 是不可變的對象, 所以在每次對 String 類型進行改變的時候其實都等同於生成了一個新的 String 對象,而後將指針指向新的 String 對象,因此常常改變內容的字符串最好不要用 String ,由於每次生成對象都會對系統性能產生影響,特別當內存中無引用對象多了之後, JVM 的 GC 就會開始工做,那速度是必定會至關慢的。安全
而若是是使用 StringBuffer 類則結果就不同了,每次結果都會對 StringBuffer 對象自己進行操做,而不是生成新的對象,再改變對象引用。因此在通常狀況下咱們推薦使用 StringBuffer ,特別是字符串對象常常改變的狀況下。而在某些特別狀況下, String 對象的字符串拼接實際上是被 JVM 解釋成了 StringBuffer 對象的拼接,因此這些時候 String 對象的速度並不會比 StringBuffer 對象慢,而特別是如下的字符串對象生成中, String 效率是遠要比 StringBuffer 快的:
String S1 = 「This is only a」 + 「 simple」 + 「 test」;
StringBuffer Sb = new StringBuilder(「This is only a」).append(「 simple」).append(「 test」);
你會很驚訝的發現,生成 String S1 對象的速度簡直太快了,而這個時候 StringBuffer 竟然速度上根本一點都不佔優點。其實這是 JVM 的一個把戲,在 JVM 眼裏,這個
String S1 = 「This is only a」 + 「 simple」 + 「test」; 其實就是:
String S1 = 「This is only a simple test」; 因此固然不須要太多的時間了。但你們這裏要注意的是,若是你的字符串是來自另外的 String 對象的話,速度就沒那麼快了,譬如:
String S2 = 「This is only a」;
String S3 = 「 simple」;
String S4 = 「 test」;
String S1 = S2 +S3 + S4;
這時候 JVM 會規規矩矩的按照原來的方式去作
StringBuffer
Java.lang.StringBuffer線程安全的可變字符序列。一個相似於 String 的字符串緩衝區,但不能修改。雖然在任意時間點上它都包含某種特定的字符序列,但經過某些方法調用能夠改變該序列的長度和內容。
可將字符串緩衝區安全地用於多個線程。能夠在必要時對這些方法進行同步,所以任意特定實例上的全部操做就好像是以串行順序發生的,該順序與所涉及的每一個線程進行的方法調用順序一致。
StringBuffer 上的主要操做是 append 和 insert 方法,可重載這些方法,以接受任意類型的數據。每一個方法都能有效地將給定的數據轉換成字符串,而後將該字符串的字符追加或插入到字符串緩衝區中。append 方法始終將這些字符添加到緩衝區的末端;而 insert 方法則在指定的點添加字符。
例如,若是 z 引用一個當前內容是「start」的字符串緩衝區對象,則此方法調用 z.append("le") 會使字符串緩衝區包含「startle」,而 z.insert(4, "le") 將更改字符串緩衝區,使之包含「starlet」。
方法:
StringBuffer類的構造函數:public StringBuffer():建立一個空的StringBuffer類的對象。app
public StringBuffer(int length): 建立一個長度爲length的StringBuffer類的對象(注意:若是參數小於零,將觸發NegativeArraySizeException異常。)。函數
public StringBuffer(String str)用一個已有的String建立StringBuffer類的對象。性能
方法:ui
(1)StringBuffer append(Type t):向字符串緩衝區追加Type類型的元素t,t能夠是布爾量、字符、字符數組、雙精度數、浮點數、整型數、長整型數對象類型的字符串、字符串和StringBuffer類等。若是添加的字符串超出了字符串緩衝區的長度,Java將自動進行擴充。spa
(2)int capacity():返回當前StringBuffer對象的總空間,而非字符創號的長度。線程
(3)char cahrAt(int index):在當前StringBuffer對象中索引號爲index的字符。第一個索引爲0。指針
(4)StringBuffer delete(int start, int end):刪除當前StringBuffer對象中以索引號start開始,到end結束的子串。對象
(5)StringBuffer deleteCharAt(int index):刪除當前StringBuffer對象中索引號爲index的字符。
(6)void ensureCapacity (int minimumCapacity):從新設置字符號串緩衝區的總空間。若是minimumCapacity大於當前的總空間,則新的空間被設置:一種結果是minimumCapacity;另外一種結果是{「老空間」乘2加2}。
(7)void getChars(int srcBegin, int srcEnd, char[] dst, int dstBegin):從當前StringBuffer對象的索引號srcBegin開始,到srcEnd結束的子串,賦值到字符數組dst中,而且從dst的索引號dstBegin開始。
(8)int indexOf(String str):返回當前StringBuffer對象中,第一個知足str子串的位置。
(9)int indexOf(String str, int fromIndex):從當前StringBuffer對象的fromIndex開始查找,返回第一個知足str子串的位置。
(10)StringBuffer insert(int offset, Type t):這些方法都是在當前StringBuffer對象中插入一個Type類型元素t,在索引號offset處插入t。
(11)int lastIndexOf(String str):返回當前StringBuffer對象中,最後一個知足str子串的位置。
(12)int lastIndexOf(String str, int fromIndex):從當前StringBuffer對象的fromIndex開始查找,返回最後一個知足str子串的位置。
(13)int length():返回當前StringBuffer對象(字符緩衝區)中,字符串的長度。注意:此方法與capacity() 不一樣。
(14)StringBuffer replace(int start, int end, String str):替換當前StringBuffer對象的字符串。從start開始,到end結束的位置替換成str。
(15)StringBuffer reverse():將字符串翻轉。
(16)void setCharAt(int index, char ch):設置索引號index的字符爲ch。
(17)void setLength(int newLength):從新設置字符串緩衝區中字符串的長度,若是newLength小於當前的字符串長度,將截去多餘的字符。
(18)String substring(int start):取當前StringBuffer對象中,從start開始到結尾的子串。
(19)String substring(int start, int end):取當前StringBuffer對象中,從start開始到end的子串。
(20)String toString():將當前StringBuffer對象轉換成String對象。
簡例:
public String toString()
轉換爲String類對象並返回。因爲大多數類中關於顯示的方法的參數多爲String類的對象,因此常常要將StringBuffer類的對象轉換爲String類的對象,再將它的值顯示出來。用法如:
StringBuffer sb=new StringBuffer("How are you?");
Label l1=new Label(sb.toString());
(注:聲明一個標籤對象l1,l1上的內容爲How are you?)
public StringBuffer append( boolean b )
public StringBuffer append( char c )
public StringBuffer append( int i)
public StringBuffer append( long l )
public StringBuffer append( float f )
public StringBuffer append( double d )
以上6個方法可將boolean、char、int、long、float和double 6種類型的變量追加到StringBuffer類的對象的後面。用法如:
double d=123.4567;
StringBuffer sb=new StringBuffer();
sb.append(true);
sb.append('c').append(d).append(99);
(注:sb的值爲truec123.456799)
public StringBuffer append( String str )
將字符串常量str追加到StringBuffer類的對象的後面。
public StringBuffer append( char str[] )
將字符數組str追加到StringBuffer類的對象的後面。
public StringBuffer append
( char str[], int offset, int len )
將字符數組str,從第offset個開始取len個字符,追加到StringBuffer類的對象的後面。
public StringBuffer insert( int offset, boolean b )
public StringBuffer insert( int offset, char c )
public StringBuffer insert( int offset, int i )
public StringBuffer insert( int offset, long l )
public StringBuffer insert( int offset, float f )
public StringBuffer insert( int offset, double d )
public StringBuffer insert( int offset, String str )
public StringBuffer insert( int offset, char str[] )
將boolean、char、int、long、float、double類型的變量、String類的對象或字符數組插入到StringBuffer類的對象中的第offset個位置。用法如:
StringBuffersb=new StringBuffer("abfg");
sb.insert(2,"cde");
(注:sb的值爲abcdefg)
public int length()
這個方法返回字符串變量的長度,用法與String類的length方法相似。
StringBuffer sbf=new StringBuffer();
System.out.println(sbf.capacity());
System.out.println(sbf.length());
輸出 16 ,0.
默認構造器是由系統自動分配容量,默認是16個字符。因爲沒有賦值,因此緩衝對象的長度就是0.
StringBuffer sbf=new StringBuffer(100);設定容量大小的構造器
charAt()方法能夠返回字符中的單個字符
setCharAt(0,‘x’) 方法能夠對字符中的單個字符進行替換
reverse() 方法能夠倒置字符串內容。