二、字符串緩存類StringBuffer
StringBuffer構造函數表
StringBuffer() 構造一個其中不帶字符的字符串緩沖區,其初始容量為 16 個字符。 |
StringBuffer(CharSequence seq) public java.lang.StringBuilder(CharSequence seq) 構造一個字符串緩沖區,它包含與指定的 CharSequence 相同的字符。 |
StringBuffer(int capacity) 構造一個不帶字符,但具有指定初始容量的字符串緩沖區。 |
StringBuffer(String str) 構造一個字符串緩沖區,並將其內容初始化為指定的字符串內容。 |
常用構造函數的使用:(可以看出StringBuffer的長度是可變的)
1 public class javaTest2 implements javaTest1 { 2 3 public static void main(String[] args) { 4 5 StringBuffer strb=new StringBuffer("aaa"); 6 System.out.println(strb); 7 StringBuffer strb1=new StringBuffer(15); 8 StringBuffer strb2=new StringBuffer(); 9 System.out.println("strb'length:"+strb.length()+" strb1'length:" 10 +strb1.length()+" strb2'length:"+strb2.length()); 11 strb2.append("aa"); 12 System.out.println("strb2's length:"+strb2.length()); 13 14 } 15 }
運行結果:
1 aaa
2 strb'length:3 strb1'length:0 strb2'length:0
3 strb2's length:2
字符串緩存可以被多個線程安全的使用。它的方法使用synchronized修飾。這些方法可以在需要的時候可以同步執行,因而任一特定實力的所有操作就好像是以串行的次序發生的。
1.StringBuffer的特點
①他可以對字符串進行修改
②長度可變
③可以操作多種數據類型
④與String相似,擁有String類的大多數方法,可以通過toString()方法變成字符串。
2.StringBuffer的功能
(1)存儲
1>append(數據)
Append()可以接收各種數據類型,除了byte和short,但是int可以替代兩者,此類方法返回的還是本類對象,因為StringBuffer是可以被改變的,無需像String一樣返回一個新的字符串。
2>inset(int offset,數據)
此方法依舊是在本類對象中修改,offset指定是在此位置插入后面的數據。
(2)刪除
1> delete(int start,int end)
返回本類對象,刪除從start到end-1位置上的字符(包頭不包尾)。
2> deleteCharAt(int index)
返回本類對象,刪除指定位置index上的字符。
(3)獲取
1> substring(int start,int end)
返回的String類型,不是StringBuffer,依舊是截取從Strart到end-1這段字符串。
2> chatAt(int index)
返回字符類型,根據指定位置查找該位上的字符
3> indexOf(String str)
返回int類型,獲取子串str在緩沖區中的起始位置
4> lastIndexOf(String str)
返回int類型,獲取子串最后一次出現在緩沖區中的具體位置
(4)修改
1> replace(int start,int end,String str)
返回本類對象,將從start到end-1的這段字符串替換成str。
2> setCharAt(int index,char ch)
無返回值,將指定位置index上的元素替換為ch。
(5)反轉
reverse()
返回本類對象,將緩沖區中的內容反轉過來。
常用方法使用
1 public class javaTest2 implements javaTest1 { 2 3 public static void main(String[] args) { 4 5 //字符串和字符串緩存的相互轉換 6 String a="aaabbbccc"; 7 StringBuffer strb=new StringBuffer(a); 8 System.out.println("strb(字符串緩存):"+strb); 9 String b=strb.toString(); 10 System.out.println("b(字符串):"+b); 11 12 13 //存儲(注:appand插在字符的尾部,insert是插在指定位置之前) 14 //(擴充appand) 15 strb.append(true); 16 System.out.println("strb擴充后1:"+strb); 17 strb.append("ddd"); 18 System.out.println("strb擴充后2:"+strb); 19 char []c={'e','e','e'}; 20 strb.append(c, 0, 2); 21 System.out.println("strb擴充后3:"+strb); 22 23 //插入insert 24 strb.insert(0, '~'); 25 System.out.println("strb插入后1:"+strb); 26 strb.insert(0, "~~"); 27 System.out.println("strb插入后2:"+strb); 28 char []c1={'&','&','&'}; 29 strb.insert(6, c1, 0, 3); 30 System.out.println("strb插入后3:"+strb); 31 32 //返回當前內容的長度 33 System.out.println("strb's length:"+strb.length()); 34 35 //查找(返回第i位置處的字符) 36 System.out.println("strb's "+"2th "+"character is "+strb.charAt(2)); 37 38 //截取(返回內容中從位置start到結束的部分。同String.substring(int start))兩種 39 String str=strb.substring(5); 40 System.out.println("截取的部分str為:"+str); 41 String str1=strb.substring(5,9); 42 System.out.println("截取的部分str1為:"+str1); 43 44 //查詢字符串位置 45 System.out.println("查詢的字符串&&第一次出現在strb的位置為:"+strb.indexOf("&&")); 46 System.out.println("查詢的字符串&&最后一次出現在strb的位置為:"+strb.lastIndexOf("&&")); 47 48 //替代(也會改變目標字符) 49 StringBuffer strb1=strb.replace(0, 3, ""); 50 System.out.println("替換后的strb: "+strb); 51 System.out.println("替換后的strb1:"+strb1); 52 53 //刪除 54 System.out.println("刪除操作后的strb:"+strb.delete(3, 6)); 55 56 //返回當前空間的大小 如果空間滿了會自動擴展 57 System.out.println( "strb's space:"+strb.capacity()); 58 59 //翻轉 60 System.out.println("strb的翻轉:"+strb.reverse()); 61 62 } 63 }
運行結果:
1 strb(字符串緩存):aaabbbccc 2 b(字符串):aaabbbccc 3 strb擴充后1:aaabbbccctrue 4 strb擴充后2:aaabbbccctrueddd 5 strb擴充后3:aaabbbccctruedddee 6 strb插入后1:~aaabbbccctruedddee 7 strb插入后2:~~~aaabbbccctruedddee 8 strb插入后3:~~~aaa&&&bbbccctruedddee 9 strb's length:24 10 strb's 2th character is ~ 11 截取的部分str為:a&&&bbbccctruedddee 12 截取的部分str1為:a&&& 13 查詢的字符串&&第一次出現在strb的位置為:6 14 查詢的字符串&&最后一次出現在strb的位置為:7 15 替換后的strb: aaa&&&bbbccctruedddee 16 替換后的strb1:aaa&&&bbbccctruedddee 17 刪除操作后的strb:aaabbbccctruedddee 18 strb's space:25 19 strb的翻轉:eedddeurtcccbbbaaa
3. StringBuilder
StringBuilder可以看做是StringBuffer的簡易替換,他們的功能一樣用法一樣。區別在於StringBuffer是線程同步的,而StringBuilder是線程不同步的。所以當我們的程序中只有一個線程時我們使用StringBuilder,這樣效率高。
總結:
其實如果把String類型看成一個基本類型的話,這樣StringBuffer和StringBuilder就類似於其包裝類。(個人看法~)
