標籤:ref start tps 空間 imp 它的 特定 物件類型 span
簡介:
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類的對象。
public StringBuffer(int length): 建立一個長度為length的StringBuffer類的對象(注意:如果參數小於零,將觸發NegativeArraySizeException異常。)。
public StringBuffer(String str)用一個已有的String建立StringBuffer類的對象。
方法:
(1)StringBuffer append(Type t):向字串緩衝區追加Type類型的元素t,t可以是布爾量、字元、字元數組、雙精確度數、浮點數、整型數、長整型數物件類型的字串、字串和StringBuffer類等。如果添加的字串超出了字串緩衝區的長度,Java將自動進行擴充。
(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() 方法可以倒置字串內容。
Java中的StringBuffer