String、StringBuilder、StringBuffer在字符串處理方面的重要性不言而喻,但是三者有什么優缺點呢?
1.三者在執行速度方面:StringBuilder>StringBuffer>String
原因:
String:字符串常量,即不可變對象;
StringBuilder:字符串變量,可變對象;
StringBuffer:字符串變量,可變對象;
由于String是字符串常量,所以在操作String類型的字符串時,不停的創建新的對象,而原來的對象不停地被GC銷毀回收,所以執行效率很低。如下代碼所示,在執行過程中str="ab"被GC銷毀回收,又創建了新的對象str="absds"。
String str="ab";
str=str+"cds";
System.out.println(str);//abcds
StringBuilder和StringBuffer是字符串變量,是可變對象,所以在對它們進行操作時,實際上是在同一個對象上進行操作,所以執行速度大于String。
一個特殊的例子:
String str="This is a"+" simple "+"example.";//1
StringBuffer sb = new StringBuffer("This is a").append("simple").append("example.");//2
這時你會發現,StringBuffer在速度上并不占優勢。查看StringBuffer的javadoc會發現,JDK對1的實現是str=(new StringBuffer().append("This is a simple example.")).toString()
,這種方法隱性生成了一個StringBuffer對象和一個String對象;而2顯性生成了一個StringBuffer對象。其實這時JVM的一個把戲,實際上:
String str="This is a"+" simple "+"example.";
其實就是:
String str="This is a simple example.";
此時如果將這個字符串這樣改寫:
String str1="This is a";//1
String st2=" simple ";//2
String str3="example.";//3
String str=str1+str2+str3;//4
那么,創建str對象時,速度就沒有那么快了。此時需要生成一個StringBuffer對象和4個String對象。
2.StringBuilder和StringBuffer
StringBuilder:線程非安全
StringBuffer:線程安全
StringBuilder是StringBuffer的簡易替換,但不保證同步,當字符串緩沖區被單線程使用時,建議使用StringBuiler。StringBuilder和StringBuffer方法基本相同。
總結:
1.如果要操作少量的數據用String;
2.單線程操作字符串緩沖區用StringBuilder;
3.多線程操作字符串緩沖區用StringBuffer;
附加StringBuffer的相關操作:
StringBuffer初始化:
StringBuffer sb=new StringBuffer();
構造一個不帶字符的字符串緩沖區,其初始容量為16個字符
StringBuffer sb=new StringBuffer(512);
構造一個長度為512字節的字符串緩沖區
StringBuffer sb=new StringBuffer("How are you?");
構造一個字符串緩沖區,并將其初始化為指定字符串。
需注意:
StringBuffer和String不是同一種類型,不能直接進行強制類型轉換,如以下代碼就是錯的:
StringBuffer sb="abc";//賦值類型不匹配
String和StringBuffer之間的相互轉化如下:
String str="abc";
StringBuffer sb = new StringBuffer(str);//String轉化為StringBuffer
String s=sb.toString();//StringBuffer轉化為String
StringBuffer的常用方法:
StringBuffer中的方法偏重于對字符串的操作,如追加、插入、刪除等,這也是StringBuffer和String的主要區別。
1.追加方法(append):
public StringBuffer append(boolean b)//將boolean參數的字符串追加到StringBuffer對象末尾
類似于字符串連接,例如:
StringBuffer sb = new StringBuffer("abc");
sb.append(true);//對象sb的值變為abctrue
可以用于SQL語句的連接,相比String對字符串的拼接可以節約內容,例如:
StirngBuffer sb = new StirngBuffer();
String user = "test";
String pwd = "123";
sb.append("select * form userInfo where username=");
sb.append(user);
sb.append("and pwd=");
sb.append(pwd);
這樣對象sb的值就是字符串“select * from userInfo where username=test and pwd=123”
。
2.刪除方法(deleteCharAt()/delete())
public StringBuffer deleteCharAt(int index)//刪除指定位置的字符,返回剩余內容組成的新字符串
例如:
StirngBuffer sb = new StringBuffer("test");
sb.deleteCharAt(1)//對象sb變為tst
public StirngBuffer delete(int start, int end)//該方法刪除指定區間內的所有字符,包括start,不包括end,并返回剩余的新字符串
例如:
StringBuffer sb = new StringBuffer("TestString");
sb.delete(1,4);//對象sb變成了TString
3.插入方法(insert)
public String insert(int ind, boolean b)//該方法在StirngBuffer指定位置插入內容,形成新的字符串。
例如:
StirngBuffer sb = new StringBuffer("abc");
sb.insert(1, true);//對象sb變成了atruebc
4.反轉方法(reverse)
public StringBuffer reverse()//該方法將StringBuffer對象中內容反轉,形成新的字符串
例如:
StringBuffer sb = new StirngBuffer("abctrue");
sb.reverse();//對象sb變為eurtcba
5.容量方法(capacity)
public int capacity()//該方法返回當前StirngBuffer對象的容量
6.charAt(int ind)方法
public char charAt(int ind)//該方法返回在ind出的字符
7.indexOf(String str)
public int indexOf(String str)//該方法返回第一次出現指定子串在該字符串中的索引