程序員必學(xué)之String字符串、StringBuffer 、StringBuilder
關(guān)于Java中的:String字符串、StringBuffer
、StringBuilder
? ? ? ? ? ? ? ? ?---------?android培訓(xùn)、java培訓(xùn)、java學(xué)習(xí)型技術(shù)博客、期待與您交流!?------------
--<?java.lang?>--?String字符串:
? String類(lèi)概述
? 字符串這類(lèi)事物,被看成是一個(gè)對(duì)象,字符串對(duì)象
? 就有描述這個(gè)對(duì)象類(lèi),java.lang.String類(lèi)
? 是被final修飾的類(lèi),不能去繼承String類(lèi)
? String 類(lèi)代表字符串。Java 程序中的所有字符串字面值(如 "abc" )都作為此類(lèi)的實(shí)例實(shí)現(xiàn)。
? java中,寫(xiě)上 "" 就是String類(lèi)的對(duì)象實(shí)例
java中用String類(lèi)進(jìn)行描述。對(duì)字符串進(jìn)行了對(duì)象的封裝。這樣的好處是可以對(duì)字符串這種常見(jiàn)數(shù)據(jù)進(jìn)行方便的操作。對(duì)象封裝后,可以定義N多屬性和行為。
如何定義字符串對(duì)象呢?String?s?=?"abc";只要是雙引號(hào)引起的數(shù)據(jù)都是字符串對(duì)象。
特點(diǎn):字符串一旦被初始化,就不可以被改變,存放在方法區(qū)中的常量池中。
//===============================================================
String?s1?=?"abc";?//?s1指向的內(nèi)存中只有一個(gè)對(duì)象abc。
String?s2?=?new?String("abc");?//?s2指向的內(nèi)容中有兩個(gè)對(duì)象abc、new?。
System.out.println(s1==s2);//false
System.out.println(s1.equals(s2));//true?,字符串中equals比較的是字符串內(nèi)容是否相同。
//===============================================================
字符串的方法:
1:構(gòu)造方法:將字節(jié)數(shù)組或者字符數(shù)組轉(zhuǎn)成字符串。?new String()
? A. 將字節(jié)數(shù)組轉(zhuǎn)成字符串 ? ? ?String(byte[] bytes)將所有的元素轉(zhuǎn)成字符串對(duì)象,但是查詢(xún)本機(jī)默認(rèn)碼表GBK ? ? ?String(byte[] bytes,int start,int length)將字節(jié)數(shù)組一部分轉(zhuǎn)成字符串對(duì)象,查詢(xún)GBK ? B. 將字符數(shù)組轉(zhuǎn)成字符串 ? ? ?String(char[] ch)將所有的元素轉(zhuǎn)成字符串對(duì)象,不查詢(xún)編碼表 ? ? ?String(char[] ch,int start ,int length)將字符串?dāng)?shù)組一部分轉(zhuǎn)成字符串對(duì)象,不查編碼表? ? ?String?s1?=?new?String();//創(chuàng)建了一個(gè)空內(nèi)容的字符串。?
? ? ?String?s2?=?null;//s2沒(méi)有任何對(duì)象指向,是一個(gè)null常量值。
? ? ?String?s3?=?"";//s3指向一個(gè)具體的字符串對(duì)象,只不過(guò)這個(gè)字符串中沒(méi)有內(nèi)容。
? ? ?//一般在定義字符串時(shí),不用new。
? ? ?String?s4?=?new?String("abc");
? ? ?String?s5?=?"abc";?一般用此寫(xiě)法
//===============================================================
--<?java.lang?>--?StringBuffer字符串緩沖區(qū):
構(gòu)造一個(gè)其中不帶字符的字符串緩沖區(qū),初始容量為?16?個(gè)字符。
特點(diǎn):
1:可以對(duì)字符串內(nèi)容進(jìn)行修改。
2:是一個(gè)容器。
3:是可變長(zhǎng)度的。
4:緩沖區(qū)中可以存儲(chǔ)任意類(lèi)型的數(shù)據(jù)。
5:最終需要變成字符串。
容器通常具備一些固定的方法:
1,添加。
StringBuffer?append(data):在緩沖區(qū)中追加數(shù)據(jù)。追加到尾部。
StringBuffer?insert(index,data):在指定位置插入數(shù)據(jù)。
2,刪除。
StringBuffer?delete(start,end);刪除從start至end-1范圍的元素
StringBuffer?deleteCharAt(index);刪除指定位置的元素
//sb.delete(0,sb.length());//清空緩沖區(qū)。
3,修改。
StringBuffer?replace(start,end,string);將start至end-1替換成string
void?setCharAt(index,char);替換指定位置的字符
void?setLength(len);將原字符串置為指定長(zhǎng)度的字符串
4,查找。(查不到返回-1)
int?indexOf(string);?返回指定子字符串在此字符串中第一次出現(xiàn)處的索引。
int?indexOf(string,int?fromIndex);從指定位置開(kāi)始查找字符串
int?lastIndexOf(string);?返回指定子字符串在此字符串中最右邊出現(xiàn)處的索引。
int?lastIndexOf(string,int?fromIndex);?從指定的索引開(kāi)始反向搜索
5,獲取子串。
string?substring(start);?返回start到結(jié)尾的子串
string?substring(start,end);?返回start至end-1的子串
6,反轉(zhuǎn)。
StringBuffer?reverse();字符串反轉(zhuǎn)
//===============================================================
--<?java.lang?>--?StringBuilder字符串緩沖區(qū):
JDK1.5出現(xiàn)StringBuiler;構(gòu)造一個(gè)其中不帶字符的字符串生成器,初始容量為?16?個(gè)字符。該類(lèi)被設(shè)計(jì)用作?StringBuffer?的一個(gè)簡(jiǎn)易替換,用在字符串緩沖區(qū)被單個(gè)線(xiàn)程使用的時(shí)候(這種情況很普遍)。
方法和StringBuffer一樣;
StringBuffer?和?StringBuilder?的區(qū)別:
StringBuffer線(xiàn)程安全。
StringBuilder線(xiàn)程不安全。
單線(xiàn)程操作,使用StringBuilder?效率高。
多線(xiàn)程操作,使用StringBuffer?安全。
//===============================================================
StringBuilder?sb?=?new?StringBuilder("abcdefg");
sb.append("ak");??//abcdefgak
sb.insert(1,"et");//aetbcdefg
sb.deleteCharAt(2);//abdefg
sb.delete(2,4);//abefg
sb.setLength(4);//abcd
sb.setCharAt(0,'k');//kbcdefg
sb.replace(0,2,"hhhh");//hhhhcdefg
//想要使用緩沖區(qū),先要建立對(duì)象。
StringBuffer?sb?=?new?StringBuffer();
sb.append(12).append("haha");//方法調(diào)用鏈。
String?s?=?"abc"+4+'q';
s?=?new?StringBuffer().append("abc").append(4).append('q').toString();
//===============================================================
class??Test{
public?static?void?main(String[]?args)?{
String?s1?=?"java";
String?s2?=?"hello";
method_1(s1,s2);
System.out.println(s1+"...."+s2);?//java....hello
StringBuilder?s11?=?new?StringBuilder("java");
StringBuilder?s22?=?new?StringBuilder("hello");
method_2(s11,s22);
System.out.println(s11+"-----"+s22);?//javahello-----hello
}
public?static?void?method_1(String?s1,String?s2){
s1.replace('a','k');
s1?=?s2;
}
public?static?void?method_2(StringBuilder?s1,StringBuilder?s2){
s1.append(s2);
s1?=?s2;
}
}
案例:字符串緩沖區(qū)自定義翻轉(zhuǎn) public class StringBufferTest { ?public static void main(String[] args) { ? StringBuilder builder = new StringBuilder(); ? builder.append("123true"); ? myReverse(builder); ? System.out.println(builder); ?} ?//字符串緩沖區(qū)翻轉(zhuǎn),用戶(hù)傳遞的就是一個(gè)緩沖區(qū),翻轉(zhuǎn)后,返回一個(gè)緩沖區(qū) ?private static StringBuilder myReverse(StringBuilder builder) ?{ ? //將緩沖區(qū)轉(zhuǎn)成String類(lèi)型 ? String s = builder.toString(); ? //通過(guò)字符串,轉(zhuǎn)成字符數(shù)組 ? char[] ch = s.toCharArray(); ? //對(duì)數(shù)組進(jìn)行翻轉(zhuǎn) ? for(int x=0,y=ch.length-1;x<y;x++,y--) ? { ? ? char temp = ch[x]; ? ? ch[x] = ch[y]; ? ? ch[y] =temp; ? } ? //將數(shù)組變成緩沖區(qū)返回 ? return builder.delete(0, builder.length()).append(ch); ?} ?//使用數(shù)組翻轉(zhuǎn),使用一個(gè)int類(lèi)型數(shù)組,實(shí)現(xiàn)翻轉(zhuǎn) ?private static void method() ?{ ? int[] arr ={3,2,1,5,6,9}; ? for(int x=0,y=arr.length-1;x<y;x++,y--) ? { ? ?//定義零時(shí)變量,存儲(chǔ)數(shù)組的0下標(biāo):整體思路就是頭和尾互換 ? ?int temp = arr[x]; ? ?//將數(shù)組的 ? ?arr[x]=arr[y]; ? ?arr[y]= temp; ? } ? for(int x=0; x<arr.length; x++) ? { ? ?System.out.println(arr[x]); ? } ?} }