【本節目标】
通過閱讀本節内容,你将學會使用StringBuffer建立可修改的“字元串”,使用CharSequenc進行統一操作,初步了解字元串相關方法及其作用,并對字元串的相關操作有更深的了解。
StringBuffer類
String類時在所有項目開發之中一定會使用的功能類,這個類擁有如下的特點:
- 每一個字元串的常量都屬于String類的匿名對象,并且不可更改;
- String有兩個常量池,靜态常量池、運作時常量池;
- String類對象執行個體化建議使用直接指派的形式完成,這樣可以直接将對象儲存在對象池之中以友善下次重用;
雖然String類很好使用,但是如果認真去思考也會發現其最大的弊端:内容不允許修改。雖然大部分情況下不會涉及到字元串内容的頻繁修改,但是依然可能會存在有這樣的情況,是以為了解決此問題,專門提供有一個StringBuffer類可以實作字元串内容的修改處理。
StringBuffer并不像String類那樣擁有兩種對象執行個體化方式,StringBuffer必須像普通類對象那樣首先進行對象執行個體化,而後才可以調用方法執行處理,而這個時候可以考慮使用StringBuffer類中的如下方法:
- 構造方法:public StringBuffer();
- 構造方法:public StringBuffer(String str),接收初始化字元串内容;
- 資料追加:public StringBuffer append(資料類型 變量),相當于字元串中“+”操作;
範例:觀察String和StringBuffer對比
String類對象引用傳遞
public class JavaAPIDemo {
public static void main(String[] args) {
String str = "Hello";
change(str);
System.out.println(str); //Hello
}
public static void change(String temp) {
temp += "World !"; //内容并沒有發生改變
}
}
StringBuffer類對象引用傳遞
public class JavaAPIDemo {
public static void main(String[] args) {
StringBuffer buf = new StringBuffer("Hello") ;
change(buf) ;
System.out.println(buf.toString()); //Hello World !
}
public static void change(StringBuffer temp) {
temp.append(" World !"); //内容已改變
}
}
實際上大部分的情況下,很少會出現有字元串内容的改變,這種改變并不是針對靜态常量池的改變。
範例:分析一下已有問題
public class JavaAPIDemo {
public static void main(String[] args) {
String strA = "www.mldn.cn";
String strB = "www." + "mldn" + ".cn";
System.out.println(strA == strB) ; //true
}
}
這時的strB對象的内容并不是改變,從更加嚴格的意義上說,對于現在的strB當程式編譯後會變成如下的形式:
public class JavaAPIDemo {
public static void main(String[] args) {
// String strB = "www." + "mldn" + ".cn";
//等同于
StringBuffer strB=new StringBuffer();
strB.append("www.").append("mldn").append(".cn");
}
}
所有的“+” 在編譯後都變為了StringBuffer中的append()方法,并且在程式之中StringBuffer和String類對象之間本來就可以直接互相轉換:
- String類對象變為StringBuffer可以依靠StringBuffer類的構造方法或者使用append()方法;
- 所有的類對象都可以通過toString()方法将其變為String類型;
在StringBuffer類中除了可以支援有字元串内容的修改之外,實際上還提供了一些String類不具備的方法:
1、插入資料:public StringBuffer insert(int offset, 資料類型 b);
public class JavaAPIDemo {
public static void main(String[] args) {
StringBuffer buf=new StringBuffer();
buf.append(".cn").insert(0,"www.").insert(4,"mldn");
System.out.println(buf.toString()); //www.mldn.cn
}
}
2、删除指定範圍的資料:public StringBuffer delete(int start, int end);
public class JavaAPIDemo {
public static void main(String[] args) {
StringBuffer buf=new StringBuffer() ;
buf.append("Hello World !").delete(6,12).insert(6, "MLDN") ; //Hello MLDN !
System.out.println(buf) ;
}
}
3、字元串内容反轉:public StringBuffer reverse();
public class JavaAPIDemo {
public static void main(String[] args) {
StringBuffer buf=new StringBuffer();
buf.append("Hello World !");
System.out.println(buf.reverse()); //! dlroW olleH
}
}
實際上與StringBuffer類還有一個類似的功能類:StringBuilder類,這個類是在JDK1.5的時候提供的,該類中提供的方法與StringBuffer功能相同,最大差別在于StringBuffer類中的方法屬于線程安全的,全部使用了synchronized關鍵字進行标注,而StringBuilder類屬于非線程安全的,
面試題:請解釋String、StringBuffer、StringBuilder的差別?
1)String類是字元串的首選類型,其最大的特點是内容不允許修改;
2)StringBuffer與StringBuilder類的内容允許修改;
3)StringBuffer是在JDK1.0時提供的,屬于線程安全的操作,而StringBuilder是JDK1.5之後提供的,屬于非線程安全的操作;
CharSequence接口
CharSequence是一個描述字元串結構的接口,在這個接口中有三種常用子類:
String類:
public final class String extends Object implements Serializable,
Comparable<String>, CharSequence;
StringBuffer類:
public final class StringBuffer extends Object implements Serializable, CharSequence;
StringBuilder類:
public final class StringBuilder extends Object implements Serializable, CharSequence;

圖一 CharSequence
現在隻要有字元串就可以為CharSequence接口執行個體化。
public class JavaAPIDemo {
public static void main(String[] args) {
CharSequence str="www.mldn.cn" ; //子類執行個體向父接口轉型
}
}
CharSequence本身是一個接口,在該接口中定義了如下操作方法:
擷取指定索引字元:public char charAt(int index);
擷取字元串長度:public int length();
截取部分字元串:public CharSequence subSequence(int start, int end);
範例:字元串截取
public class JavaAPIDemo {
public static void main(String[] args) {
CharSequence str="www.mldn.cn" ; //子類執行個體向父接口轉型
CharSequence sub=str.subSequence(4,8) ;
System.out.println(sub) ; //mldn
}
}
以後隻要看見CharSequence描述的就是一個字元串。
想學習更多的Java的課程嗎?從小白到大神,從入門到精通,更多精彩不容錯過!免費為您提供更多的學習資源。
本内容視訊來源于
阿裡雲大學 下一篇:使用AutoCloseable實作資源自動關閉 | 帶你學《Java語言進階特性》之十七 更多Java面向對象程式設計文章檢視此處