java stringbuffer详解_Java常用类StringBuffer详解
內容多為最近學習的自我總結,可能有些地方寫的不嚴謹,甚至會有錯誤的地方,僅供參考,如發現錯誤敬請指出,謝謝!
灰色字體為補充擴展內容,多為幫助自己理解。
StringBuffer概述:
線程安全的可變字符序列。一個類似于 String 的字符串緩沖區,但不能修改。雖然在任意時間點上它都包含某種特定的字符序列,但通過某些方法調用可以改變該序列的長度和內容。
線程不安全:
舉例:我在銀行創建賬戶會給我銀行卡和存折,我在賬戶中存入200,如果我和另一個人同時各拿著銀行卡和存折去取錢,如果信息沒有同步,那我們兩個都能取出200,這就是線程不安全。
線程安全:
線程之間會同步信息(我走你不走,你走我不走)(互斥)。
StringBuffer構造方法:
StringBuffer()?:
構造一個其中不帶字符的字符串緩沖區,其初始容量為 16 個字符。(容量是可以自動擴容的)
自己理解 :創建一個空的字符序列(頻繁的擴容很耗時)。
StringBuffer(int capacity)
構造一個不帶字符,但具有指定初始容量的字符串緩沖區。
自己理解 :創建了一個空的字符序列,容量為capacity。
StringBuffer(String str)
構造一個字符串緩沖區,并將其內容初始化為指定的字符串內容。該字符串的初始容量為 16 加上字符串參數的長度。
自己理解 :創建了容量為 str.length+16容量的字符串序列,里面存儲了字符串str。
測試代碼:
1 //StringBuffer的構造函數2 public class StringBufferDemo01 {3 public static void main(String[]args) {4 //StingBuffer()創建一個不帶字符的字符串緩沖區5 StringBuffer sb1=new StringBuffer();6 //輸入字符串長度7 System.out.println(sb1.length());//0
8 //輸出字符串容量9 System.out.println(sb1.capacity());//16
10 //StringBuffer(int capacity)構造一個不帶字符的指定初始容量的字符串緩沖區11 StringBuffer sb2=new StringBuffer(130);12 System.out.println(sb2.length());//0
13 System.out.println(sb2.capacity());//130
14 //StringBuffer(String str)15 StringBuffer sb3=new StringBuffer("zhaoyuan");16 System.out.println(sb3.length());//8
17 System.out.println(sb3.capacity());//24
18
19 }20 }
添加方法:
append()和insert()可以添加任意類型,基本數據類型和引用數據類型都可以。
append()方法:(重寫)
StringBuffer append(Object obj)
追加 Object 參數的字符串表示形式。
注:調用的是toString()方法,拼接的是toString方法返回的字符串。
StringBuffer append(char[] str)
將 char 數組參數的字符串表示形式追加到此序列。
注:是將數組里的內容進行拼接,而不是調用toString()
StringBuffer append(boolean b)
將 boolean 參數的字符串表示形式追加到序列。
StringBuffer append(char c)
將 char 參數的字符串表示形式追加到此序列。
StringBuffer append(char[] str, int offset, int len)
將 char 數組參數的子數組的字符串表示形式追加到此序列。
StringBuffer append(CharSequence s)
將指定的 CharSequence 追加到該序列。
StringBuffer append(CharSequence s, int start, int end)
將指定 CharSequence 的子序列追加到此序列。
StringBuffer append(double d)
將 double 參數的字符串表示形式追加到此序列。
StringBuffer append(float f)
將 float 參數的字符串表示形式追加到此序列。
StringBuffer append(int i)
將 int 參數的字符串表示形式追加到此序列。
StringBuffer append(long lng)
將 long 參數的字符串表示形式追加到此序列。
StringBuffer append(String str)
將指定的字符串追加到此字符序列。
StringBuffer append(StringBuffer sb)
將指定的 StringBuffer 追加到此序列中。
注意:在添加int類型數組時,其實是調用了StringBuffer append(Object obj) 方法,拼接的是數組的地址。
問題:StringBuffer的append方法直接修改了對象的值,那為什么還返回的是StringBuffer類型為什么返回值不是void?
StingBuffer對象調用append方法的時候,添加的字符串是添加到自身字符串序列,目的為為了鏈式編程。
測試代碼:
1 //StringBuffer的添加功能方法
2 public classStringBufferDemo_02 {3 public static voidmain(String[] args) {4 //append(String str)
5 StringBuffer sb1=new StringBuffer("Hello");6 StringBuffer sb2=sb1.append("World");7 System.out.println(sb1);//HelloWorld
8 System.out.println(sb2);//HelloWorld
9 System.out.println(sb1==sb2);//true
10 System.out.println("------------------------------------------");11 //鏈式編程:
12 byte b = 1;13 short s = 10;14 int i = 100;15 long l = 1000L;16 char c = '中';17 float f = 1.23f;18 double d =3.14;19 boolean flag = true;20 Object obj = new Student();//在同一個包下我創建的有一個Studnet類
21 char []arr={'嘿','哈','嘻'};22 StringBuffer sb = newStringBuffer();23 sb.append(b).append(s).append(i).append(l).append(c).append(f).append(d).append(flag).append(obj).append(arr);24 System.out.println(sb);//1101001000中1.233.14trueStudent{name='null', age=0}嘿哈嘻
25 }
insert()方法:(重寫)
StringBuffer insert(int offset, boolean b)
將 boolean 參數的字符串表示形式插入此序列中。
StringBuffer insert(int offset, char c)
將 char 參數的字符串表示形式插入此序列中。
StringBuffer insert(int offset, char[] str)
將 char 數組參數的字符串表示形式插入此序列中。
StringBuffer insert(int index, char[] str, int offset, int len)
將數組參數 str 的子數組的字符串表示形式插入此序列中。
StringBuffer insert(int dstOffset, CharSequence s)
將指定 CharSequence 插入此序列中。
StringBuffer insert(int dstOffset, CharSequence s, int start, int end)
將指定 CharSequence 的子序列插入此序列中。
StringBuffer insert(int offset, double d)
將 double 參數的字符串表示形式插入此序列中。
StringBuffer insert(int offset, float f)
將 float 參數的字符串表示形式插入此序列中。
StringBuffer insert(int offset, int i)
將 int 參數的字符串表示形式插入此序列中。
StringBuffer insert(int offset, long l)
將 long 參數的字符串表示形式插入此序列中。
StringBuffer insert(int offset, Object obj)
將 Object 參數的字符串表示形式插入此字符序列中。
StringBuffer insert(int offset, String str)
將字符串插入此字符序列中。
注:添加在序列的最后,插入的索引位置應該是str.length()不用-1。
測試代碼:
1 packagecom.cskaoyan.StringBuffer;2 //insert方法
3 public classStringDemo_03 {4 public static voidmain(String[] args) {5 StringBuffer sb1=new StringBuffer("world");6 sb1.insert(0,"hello ");//hello world
7 System.out.println(sb1);8 sb1.insert(sb1.length(),"!!");9 System.out.println(sb1);//hello world!!
10
11 }12 }
刪除方法:
StringBuffer delete(int start, int end)
移除此序列的子字符串中的字符。
移除此序列的子字符串中的字符。該子字符串從指定的 start 處開始,一直到索引 end - 1 處的字符,如果不存在這種字符,則一直到序列尾部。如果 start 等于 end,則不發生任何更改。
參數:(包左不包右)
start - 起始索引(包含)。
end - 結束索引(不包含)。
StringBuffer deleteCharAt(int index)
移除此序列指定位置的 char。
移除此序列指定位置的 char。此序列將縮短一個 char。
注:如果給定索引處的字符是增補字符,則此方法將不會移除整個字符。如果需要準確處理增補字符,那么可以通過調用
測試代碼:
1 public classStringBufferDemo_03 {2 public static voidmain(String[] args) {3 StringBuffer sb=new StringBuffer("Hello World!!");4 sb.deleteCharAt(0);5 System.out.println(sb);//ello World!!6 //在刪除索引位置后,此序列將縮短一個
7 StringBuffer sb1=new StringBuffer("Hello World!!");8 sb1.deleteCharAt(0).deleteCharAt(1).deleteCharAt(2);9 System.out.println(sb1);//el World!!10 //public StringBuffer delete(int start,int end) 包左不包右
11 StringBuffer sb2=new StringBuffer("Hello World!!");12 sb2.delete(0,6);13 System.out.println(sb2);//World!!
14 }15 }
替換方法:
StringBuffer replace(int start, int end, String str)
使用給定 String 中的字符替換此序列的子字符串中的字符。該子字符串從指定的 start 處開始,一直到索引 end - 1 處的字符,如果不存在這種字符,則一直到序列尾部。先將子字符串中的字符移除,然后將指定的 String 插入 start。(如果需要,序列將延長以適應指定的字符串。)
參數:(包左不包右)
start - 起始索引(包含)。
end - 結束索引(不包含)。
str - 將替換原有內容的字符串。
測試代碼:
1 public classStringBufferDemo_04 {2 public static voidmain(String[] args) {3 StringBuffer sb=new StringBuffer("我愛學習");4 sb.replace(2,4,"睡覺");5 System.out.println(sb);//我愛睡覺6 //這里序列擴容了
7 sb.replace(2,9,"學習java");//我愛學習java
8 System.out.println(sb);9 }10 }
反轉功能:
StringBuffer reverse()
概述:將此字符序列用其反轉形式取代。
代碼測試:
1 public classStringBuffer_05 {2 public static voidmain(String[] args) {3 StringBuffer sb1=new StringBuffer("Hello World!!");4 sb1.reverse();5 System.out.println(sb1);//!!dlroW olleH
6 }7 }
截取功能:
String substring(int start)
返回一個新的 String,它包含此字符序列當前所包含的字符子序列。該子字符串始于指定索引處的字符,一直到此字符串末尾。
參數:
start - 起始索引(包含)。
返回:(注意:上面個所寫的方法修改的都是本身,而subString返回的是一個String類型的字符串)
新的字符串。
String substring(int start, int end)
返回一個新的 String,它包含此序列當前所包含的字符子序列。
返回一個新的 String,它包含此序列當前所包含的字符子序列。該子字符串從指定的 start 處開始,一直到索引 end - 1 處的字符。
參數(包左不包右):
start - 起始索引(包含)。
end - 結束索引(不包含)。
返回:
新的字符串。
測試代碼:
1 public classStringBufferDemo_06 {2 public static voidmain(String[] args) {3 StringBuffer sb=new StringBuffer("hello world");4 String s1=sb.substring(6);5 System.out.println(s1);//wolrd
6 String s2=sb.substring(0,6);7 System.out.println(s2);//hello
8 }9 }
總結String 和StringBuffer互換問題:
String -- >StringBuffer:
a:通過構造方法
b:通過append()方法
StringBuffer --> String:
a:通過構造方法
b:通過toString()方法
c:通過subString(0,length);
StringBuilder:
一個可變的字符序列。此類提供一個與 StringBuffer 兼容的 API,但不保證同步。
(單線程的環境下或者不會出現線程安全問題的多線程程序中應該使用StringBuilder)
多線程環境下只有只有在需要信息同步的時候才需要考慮線程安全:
同步(synchronized): 線程安全,效率低(你走我不走,我走你不走)
異步: 線程不安全,效率高(你走你的,我走我的)
構造方法:
和StingBuffer一樣
區別:
String:不可變的字符序列
StringBuffer:可變的字符序列,線程安全,效率低
StringBuilder:可變的字符程序類,線程不安全,效率高,使用的多
StringBuffer和數組的區別:
StingBuffer:可擴容,可以添加任意數據,都會轉換成對應 的文本表現形式
數組:長度固定,只能添加同一數據類型
關于StringBuffer的面試題:
String作為參數傳遞
StringBuffer作為參數傳遞
1 public classStringBufferDemo6 {2 public static voidmain(String[] args) {3 String s1 = "Hello";4 String s2 = "world";5 change(s1, s2);6 System.out.println("s1 = " + s1); //Hello
7 System.out.println("s2 = " + s2); //world
8
9 StringBuffer sb1 = new StringBuffer("Hello");10 StringBuffer sb2 = new StringBuffer("world");11 change(sb1, sb2);12 System.out.println("sb1 = " + sb1); //Hello
13 System.out.println("sb2 = " + sb2); //worldworld
14 }15
16 public static voidchange(StringBuffer sb1, StringBuffer sb2) {17 sb1 =sb2;18 sb2 =sb2.append(sb1);19 }20
21 public static voidchange(String s1, String s2) {22 s1 =s2;23 s2 +=s1;24 }25 }
畫圖理解:
總結
以上是生活随笔為你收集整理的java stringbuffer详解_Java常用类StringBuffer详解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java获取hdfs总大小_如何获取出H
- 下一篇: Java个人学生信息的录入_java录入