一、String
1、String 類代表字符串。Java 程序中的所有字符串字面值(如 "abc" )都作為此類的實(shí)例實(shí)現(xiàn)。
2、字符串是常量;它們的值在創(chuàng)建之后不能更改。字符串緩沖區(qū)支持可變的字符串。因?yàn)?String 對象是不可變的,所以可以共享。
3、string的常用方法
(1)1、length() 字符串的長度,String length() 是針對數(shù)組來說的
例:char chars[]={'a','b'.'c'};
String s=new String(chars);
int len=s.length();
(2)charAt() 截取一個字符
例:char ch;
ch="abc".charAt(1); 返回’b'
(3)startsWith()和endsWith()
startsWith()方法決定是否以特定字符串開始, endWith()方法決定是否以特定字符串結(jié)束
(4)equals()和==
equals()方法比較字符串對象中的字符,==運(yùn)算符比較兩個對象是否引用同一實(shí)例。
例:String s1="Hello";
String s2=new String(s1);
s1.eauals(s2); //true
s1==s2;//false
(5)substring()截取一段字符。它有兩種形式,遵循前閉后開的原則。
第一種是:String substring(int startIndex);
第二種是:String substring(int startIndex,int endIndex)
(6)replace() 替換
它有兩種形式,第一種形式用一個字符在調(diào)用字符串中所有出現(xiàn)某個字符的地方進(jìn)行替換,形式如下:
String replace(char original,char replacement)
例如:String s="Hello".replace('l','w');
第二種形式是用一個字符序列替換另一個字符序列,形式如下:
String replace(CharSequence original,CharSequence replacement)
用后一個字符串替換前一個字符
(7)java.lang.String.contains() 方法返回true,當(dāng)且僅當(dāng)此字符串包含指定的char值序列 返回值為boolean
(8)concat()連接字符串:string1.concat(string2);
(9)String trim() 返回字符串的一個副本,開頭和結(jié)尾的空格去除。
二、StringBuffer
1、StringBuffer是線程安全的可變字符序列。一個類似于 String
的字符串緩沖區(qū),但不能修改。雖然在任意時間點(diǎn)上它都包含某種特定的字符序列,但通過某些方法調(diào)用可以改變該序列的長度和內(nèi)容。
2、可將字符串緩沖區(qū)安全地用于多個線程。可以在必要時對這些方法進(jìn)行同步,因此任意特定實(shí)例上的所有操作就好像是以串行順序發(fā)生的,該順序與所涉及的每個線程進(jìn)行的方法調(diào)用順序一致。
3、StringBuffer上的主要操作是 append 和 insert方法,可重載這些方法,以接受任意類型的數(shù)據(jù)。每個方法都能有效地將給定的數(shù)據(jù)轉(zhuǎn)換成字符串,然后將該字符串的字符追加或插入到字符串緩沖區(qū)中。append方法始終將這些字符添加到緩沖區(qū)的末端;而 insert方法則在指定的點(diǎn)添加字符。
三、StringBuilder
1、一個可變的字符序列。此類提供一個與 StringBuffer兼容的 API,但不保證同步。該類被設(shè)計用作 StringBuffer的一個簡易替換,用在字符串緩沖區(qū)被單個線程使用的時候(這種情況很普遍)。如果可能,建議優(yōu)先采用該類,因?yàn)樵诖蠖鄶?shù)實(shí)現(xiàn)中,它比 StringBuffer要快。
2、在 StringBuilder上的主要操作是 append和 insert方法,可重載這些方法,以接受任意類型的數(shù)據(jù)。每個方法都能有效地將給定的數(shù)據(jù)轉(zhuǎn)換成字符串,然后將該字符串的字符追加或插入到字符串生成器中。append方法始終將這些字符添加到生成器的末端;而 insert方法則在指定的點(diǎn)添加字符。
例如:
如果 z引用一個當(dāng)前內(nèi)容為 "start" 的字符串的生成器對象,則該方法調(diào)用 z.append("le")將使字符串生成器包含 "startle",而 z.insert(4, "le")將更改字符串生成器,使之包含 "starlet"。
3、通常,如果 sb 引用 StringBuilder的實(shí)例,則 sb.append(x)和 sb.insert(sb.length(), x)具有相同的效果。每個字符串生成器都有一定的容量。只要字符串生成器所包含的字符序列的長度沒有超出此容量,就無需分配新的內(nèi)部緩沖區(qū)。如果內(nèi)部緩沖區(qū)溢出,則此容量自動增大。
4、將 StringBuilder的實(shí)例用于多個線程是不安全的。如果需要這樣的同步,則建議使用 StringBuffer。
四、String、StringBuffer、StringBuilder的區(qū)別
1、String是字符串常量,StringBuffer、StringBuilder是字符串變量
(1) 因?yàn)槲覀兘?jīng)常會做這樣的操作:
String s = "asd";
s = s+1;
System.out.print(s);// result : asd1
感覺上s是變了,其實(shí)不是。在JVN中是這樣執(zhí)行這段代碼的:先為s開辟一個存儲空間,來存儲asd,在執(zhí)行s = s + 1時,再為s開辟存儲空間來存s + 1
原來的s是不變的,所以String是常量。
由于這種機(jī)制,每當(dāng)用String操作字符串時,實(shí)際上是在不斷的創(chuàng)建新的對象,而原來的對象就會變?yōu)槔唬牵没厥盏簦孕屎艿汀?br>
(2)看下面的操作:
String str = “a” + “ b” + “ c”;
StringBuilder builder = new StringBuilder(“a”).append(“ b”).append(“ c”);
感覺上是String比StringBuilder快了一些,但是如果換一下:
String s1 = "a";
String s2 = "b";
String s3 = "c";
String s4 = s1 + s2 + s3;
這樣就能看出來了。
2、三者在執(zhí)行速度方面的比較:StringBuilder > StringBuffer > String
3、StringBuilder與 StringBuffer:StringBuilder:線程非安全的;StringBuffer:線程安全的
當(dāng)我們在字符串緩沖去被多個線程使用是,JVM不能保證StringBuilder的操作是安全的,雖然他的速度最快,但是可以保證StringBuffer是可以正確操作的。當(dāng)然大多數(shù)情況下就是我們是在單線程下進(jìn)行的操作,所以大多數(shù)情況下是建議用StringBuilder而不用StringBuffer的,就是速度的原因。
4、總結(jié):
對于三者使用的總結(jié):
(1)如果要操作少量的數(shù)據(jù)用 = String
(2)單線程操作字符串緩沖區(qū) 下操作大量數(shù)據(jù) = StringBuilder
(3)多線程操作字符串緩沖區(qū) 下操作大量數(shù)據(jù) = StringBuffer