字符串String、StringBuffer、StringBuider

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?將兩個字符串進行自然順序的比較。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容