StringBuffer對String型別的操作
String類是所有專案開發中一定會用到的一個功能類,並且這個類擁有如下的特點:
- 每一個字串的常量都屬於一個String類的匿名物件,並且不可更改;
- String有兩個常量池:靜態常量池、執行時常量池;
- String類物件例項化建議使用直接賦值的形式完成,這樣可以直接將物件儲存在物件池之中以方便下次重用。
雖然String類很好使用,但是如果認真去思考也會發現其最大的弊端:內容不允許修改,雖然大部分情況下我們都不會涉及到字串內容的頻繁修改,但是依然會存在這樣的情況,多以為了解決此問題,專門提供了一個StirngBuffer類實現字串內容的修改處理。
**範例:**觀察String與StringBuffer的對比
Stirng類物件的引用傳遞:
public class JavaApi {
public static void main(String[] args) {
String str = "Hello ";
change(str);
System.out.println(str); //內容沒有發生改變
}
public static void change(String temp){
temp += "world";
}
}
StirngBuffer並不像Stirng類那樣有兩種物件例項化,StringBuffer必須像普通類那樣首先進行物件例項化,而後在才可以呼叫方法進行處理,而這個時候可以呼叫StringBuffer類中的如下方法:
- 構造方法: public StirngBuilder(){};
- 構造方法: public StringBuilder(String str){};
- 資料追加: public StringBuilder append(資料型別 變數);相當於字串的加操作。
StringBuffer類引用傳遞:
public class JavaApi { public static void main(String[] args) { StringBuffer btf = new StringBuffer("Hello "); change(btf); System.out.println(btf); //內容沒有發生改變 } public static void change(StringBuffer temp){ temp.append("world !"); } }
大多數情況下,很少會出現有字串內容的改變,這種改變指的並不是針對於靜態常量池的改變:
**範例:**分析一下已有問題
public static void main(Stirng[] args){
Stirng strA = "www.baidu.com";
String strB = "www." + "mldn" +".com";
System.out.println(strA == strB);
}
這個時候的strB物件內容的改變不算改變,從更加嚴格的意義上來講,對於現在的strB當程式編譯之後會變為如下形式:
String strB = "www." + "mldn" +".com";
StringBuffer buf = new StringBuffer();
buf.append("www.").append("mldn").append(".com);
所有的“+”在編譯之後都變為了StirngBuffer中的append()方法,並且在程式中StirngBuffer與String類物件之間可以互相轉換:
- String類物件變為StringBuffer可以依靠StringBuffer的構造方法或者append()方法
- 所有的類物件都可以通過toStirng()方法變為String物件。
在StringBufferl類裡面除了有字串修改以外,實際上也提供了一些其他的方法:
1、插入資料: publc StirngBuffer insert(int offset,資料型別 變數);
public static void main(String[] args) {
StringBuffer btf = new StringBuffer();
btf.append(".com").insert(0,"www.").insert(4,"baidu");
System.out.println(btf); //內容沒有發生改變
}
2、刪除指定範圍的資料: public StringBuffer delete(int start,int end);
public static void main(String[] args) {
StringBuffer btf = new StringBuffer();
btf.append("hello world").delete(6,12).insert(6,"baidu");
System.out.println(btf); //內容沒有發生改變
}
3、字串內容的反轉
public static void main(String[] args) {
StringBuffer btf = new StringBuffer();
btf.append("hello world");
System.out.println(btf.reverse()); //內容沒有發生改變
}
實際上與StringBuffer類還有一個類似的功能類:StringBuilder類,這個類是JDK1.5的時候提供的,該類中提供的方法,與StringBuffer的功能相同,最大的區別在於StringBuffer類中的方法屬於執行緒安全的,全部方法使用synchronized關鍵字標註,而StringBuilder類屬於非執行緒安全的。
**面試題:請解釋String、StringBuffer、StringBuilder的區別?
- Stirng類是字串的首選型,其最大特點是內容不允許修改;
- StringBuffer和StringBuilder類的內容可以進行修改;
- StringBuffer是在JDK1.0的時候提供的,屬於執行緒安全的操作,StringBuilder是在JDK1.5的時候提供的,屬於非執行緒安全的操作。