1. 三者在執(zhí)行速度方面的比較:StringBuilder?>? StringBuffer? >? String
2.?String <(StringBuffer,StringBuilder)的原因
String:字符串常量
StringBuffer:字符串變量
StringBuilder:字符串變量
從上面的名字可以看到,String是“字符串常量”,也就是不可改變的對象。對于這句話的理解你可能會產(chǎn)生這樣一個疑問? ,比如這段代碼:
????????????????????????String s = "abcd";
????????????????????????s = s+1;
????????????????????????System.out.print(s);// result : abcd1
? ?? 我們明明就是改變了String型的變量s的,為什么說是沒有改變呢? 其實這是一種欺騙,JVM是這樣解析這段代碼的:首先創(chuàng)建對象s,賦予一個abcd,然后再創(chuàng)建一個新的對象s用來執(zhí)行第二行代碼,也就是說我們之前對象s并沒有變化,所以我們說String類型是不可改變的對象了,由于這種機制,每當用String操作字符串時,實際上是在不斷的創(chuàng)建新的對象,而原來的對象就會變?yōu)槔唬牵没厥盏?,可想而知這樣執(zhí)行效率會有多底。
? 而StringBuffer與StringBuilder就不一樣了,他們是字符串變量,是可改變的對象,每當我們用它們對字符串做操作時,實際上是在一個對象上操作的,這樣就不會像String一樣創(chuàng)建一些而外的對象進行操作了,當然速度就快了。
3.? StringBuilder??與??StringBuffer
StringBuilder:線程非安全的
StringBuffer:線程安全的
當我們在字符串緩沖去被多個線程使用是,JVM不能保證StringBuilder的操作是安全的,雖然他的速度最快,但是可以保證StringBuffer是可以正確操作的。當然大多數(shù)情況下就是我們是在單線程下進行的操作,所以大多數(shù)情況下是建議用StringBuilder而不用StringBuffer的,就是速度的原因。
對于三者使用的總結(jié): 1.如果要操作少量的數(shù)據(jù)用 = String
2.單線程操作字符串緩沖區(qū) 下操作大量數(shù)據(jù) = StringBuilder
? ? ? 3.多線程操作字符串緩沖區(qū) 下操作大量數(shù)據(jù) = StringBuffer
String的基本操作方法:
常用的方法如下:
?1、獲?。?/b>
????1.1?字符串中包含的字符數(shù),也就是字符串的長度。
????????int?length():獲取長度。
????1.2?根據(jù)位置獲取該位置上的某個字符。
????????char?charAt(int?index):返回指定索引處的char值。
????1.3?根據(jù)字符獲取該字符在字符串的位置。
????????int?indexOf(String?str):返回的是str在字符串中第一次出現(xiàn)的位置。
????????int?indexOf(int?ch,int?fromIndex):從fromIndex指定位置開始,獲取ch在字符串中出現(xiàn)的位置。
????????int?lastIndexOf(int?ch):反向索引一個字符出現(xiàn)的位置
?2、判斷:
????2.1??字符串中是否包含某一個子串。
????????boolean?contains(str);
????????特殊之處:indexOf(str):可以索引str第一次出現(xiàn)的位置,如果返回-1表示該str不在字符串中存在。
??????????????????所以,也可以用于對指定判斷是否包含。
?????????????????if(str.indexOf("aa")!=-1)??
??????????????????而且該方法既可以判斷,又可以獲取出現(xiàn)的位置
????2.2?字符中是否有內(nèi)容。
????????boolean?isEmpty():原理就是判斷長度是否為0.
????2.3?字符串是否是以指定內(nèi)容開頭。
????????boolean?startsWith(str);
????2.4?字符串是否是以指定內(nèi)容結(jié)尾。
????????boolean?endsWith(str);
????2.5判斷字符串內(nèi)容是否相同。復寫Object類中的equals方法。
????????boolean?equals(str);
????2.6?判斷內(nèi)容是否相同,并忽略大小寫
????????boolean?equalsIgnoreCase();
?3、轉(zhuǎn)換
????3.1?將字符數(shù)組轉(zhuǎn)換成字符串。
????????構(gòu)造函數(shù):?String(char[])
??????????????????String(char[],offset,count):將字符數(shù)組中的一部分轉(zhuǎn)換成字符串。
????????靜態(tài)方法:
?????????????????static?String?copyValueOf(char[]);
?????????????????static?String?copyvalueOf(char[]?data,?int?offset,?int?count);
????3.2?將字符串轉(zhuǎn)換成字符數(shù)組(重點)。
????????????????char[]?toCharArray();
????3.3?將字節(jié)數(shù)組轉(zhuǎn)換成字符串。
?????????????????String(byte[])
?????????????????String(byte[],offset,count):將字節(jié)數(shù)組中的一部分轉(zhuǎn)換成字符串。
????3.4?將字符串轉(zhuǎn)換成字節(jié)數(shù)組
????3.5?將基本數(shù)據(jù)類型轉(zhuǎn)換成字符串。
????????String?valueOf(int);
????????String?valueOf(double);
????????特殊:字符串和字節(jié)數(shù)組在轉(zhuǎn)換過程中是可以指定編碼表的。
?4、替換
????????String?replace(oldchar,newchar);
?5、切割
????????String[]?split(regex);
?6、子串(獲取字符串中的一部分)
????????String?substring(begin);
????????String?substring(begin,end);
?7、轉(zhuǎn)換,去除空格,比較
????7.1?將字符串轉(zhuǎn)成大寫或者小寫。
????????String?toUpperCase();
????????String?toLowerCase();
????7.2?將字符串兩端的多個空格去除。
????????String?trim();
????7.3?將兩個字符串進行自然順序的比較。