介紹
StringBuffer是一個(gè)可以動(dòng)態(tài)修改的字符串類,
String類是不可以修改的,如果被修改的話,它會(huì)產(chǎn)生一個(gè)新的對(duì)象,而不是它本身原來的。
兩者是不同的類型,一般不能強(qiáng)制性轉(zhuǎn)換,可以通過這樣的方法。
String-->StringBuffer:
String string="123";
StringBuffer stringBuffer=new StringBuffer(string);
StringBuffer->String:
StringBuffer stringBuffer=new StringBuffer("123");
String string=stringBuffer.toString();
下面還是用例子來說明String一般不可修改的原因:
package blogTest;
/*
* String類是不可以修改的 如果修改了那么它和之前的 不是同一個(gè)對(duì)象
* 從它們的地址可以看出 這里我們用hashCode獲取它們的地址.
*/
public class TestStringBuffer {
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println("-----------------String類:------------------");
String string="123";
System.out.println("原先的string:\t"+string);
System.out.println("它的hashCode:\t"+Integer.toHexString(string.hashCode()));
System.out.println("\n***************\n");
string=string+"1";
System.out.println("經(jīng)過修改的string:\t"+string);
System.out.println("修改后的它的hashCode:\t"+Integer.toHexString(string.hashCode()));
System.out.println("\n-----------------StringBuffer類:------------------");
StringBuffer stringBuffer=new StringBuffer("123");
System.out.println("原先的stringBuffer:\t"+stringBuffer);
System.out.println("它的hashCode:\t"+Integer.toHexString(stringBuffer.hashCode()));
System.out.println("\n***************\n");
stringBuffer.append("1");
System.out.println("經(jīng)過修改的string:\t"+stringBuffer);
System.out.println("修改后的它的hashCode:\t"+Integer.toHexString(stringBuffer.hashCode()));
}
}
/*
結(jié)果如下:
-----------------String類:------------------
原先的string: 123
它的hashCode: be32
***************
經(jīng)過修改的string: 1231
修改后的它的hashCode: 17083f
-----------------StringBuffer類:------------------
原先的stringBuffer: 123
它的hashCode: 2a139a55
***************
經(jīng)過修改的string: 1231
修改后的它的hashCode: 2a139a55
*/
結(jié)論:
我們可以很容易的看出,
String類經(jīng)過修改后它的地址發(fā)生了變化,這說明它已經(jīng)不是本身原來的對(duì)象而是一個(gè)新的對(duì)象。
而StringBuffer則沒有這個(gè)改變。
下面就開始介紹StringBuffer了。
創(chuàng)建就是最基本的了。
源碼如下:(可以帶參數(shù)也可以不帶參數(shù))
StringBuffer stringBuffer=new StringBuffer("123");
使用的話,一般就是這幾個(gè)方法了
append() 追加字符串
insert() 插入
delete() 刪除
indeOf() 索引第一次出現(xiàn)的
charAt() 獲取值
toString() 轉(zhuǎn)換為字符串
length() 返回字符串長(zhǎng)度
比較不常的:
capacity() 容量長(zhǎng)度
reverse() 翻轉(zhuǎn)字符串
trimToSize() 將容量減少到和字符串長(zhǎng)度一致
subString() 返回一個(gè)新的String
基本參數(shù)你在IDE上輸入的時(shí)候基本上后邊都有,不記錄了。
這里書寫一下
最常用的append();
和其它的
reverse() 修改了本身的值
trimTosize()
capacity() 初始化容量好像是16
subString() 返回的是一個(gè)字符串
package blogTest;
/*
* String類是不可以修改的 如果修改了那么它和之前的 不是同一個(gè)對(duì)象
* 從它們的地址可以看出 這里我們用hashCode獲取它們的地址.
*/
/*
* 幾個(gè)主要方法
* append()
* reverse()
* insert()
* delete()
* replace()
*/
/*
* 查看源碼還是挺有意思的
*
*/
public class TestStringBuffer {
public static void main(String[] args) {
// TODO Auto-generated method stub
// -----------append() capacity() length()-------------
System.out.println("-----------append() capacity() length()-------------\n");
StringBuffer stringBuffer=new StringBuffer();//初始化默認(rèn)容量 16
System.out.println("stringBuffer容量為:\t\t\tstringBuffer.capacity()="+stringBuffer.capacity());//當(dāng)前容量
stringBuffer.append('h');
stringBuffer.append(1);
stringBuffer.append("hello");
System.out.println("stringBuffer輸出默認(rèn)為字符串:\t\t"+stringBuffer);//輸出默認(rèn)為字符串 你可以重寫toString()方法修改
System.out.println("stringBuffer容量為:\t\t\tstringBuffer.capacity()="+stringBuffer.capacity());//當(dāng)前容量
System.out.println("stringBuffer字符串長(zhǎng)度為:\t\tstringBuffer.length()="+stringBuffer.length());//當(dāng)前字符串長(zhǎng)度
// -------------trimToSize()--------------------
System.out.println("\n-------------trimToSize()--------------------\n");
stringBuffer.trimToSize(); //將容量縮短為字符串長(zhǎng)度
System.out.println("stringBuffer容量為:\t\t\tstringBuffer.capacity()="+stringBuffer.capacity());//當(dāng)前容量
System.out.println("stringBuffer字符串長(zhǎng)度為:\t\tstringBuffer.length()="+stringBuffer.length());//當(dāng)前字符串長(zhǎng)度
// -------------reverse()---------------------
System.out.println("\n-------------reverse()---------------------\n");
System.out.println("原先的stringBuffer為:\t"+stringBuffer);
System.out.println("stringBuffer.reverse():\t"+stringBuffer.reverse());
System.out.println("這時(shí)候的stringBuffer為:\t"+stringBuffer);
// -------------subString()---------------------
System.out.println("\n-------------subString()---------------------\n");
stringBuffer.reverse();
System.out.println("stringBuffer:\t\t\t"+stringBuffer);
String strTest=stringBuffer.substring(2);
System.out.println("stringBuffer.subString(2):\t"+strTest); //忽然發(fā)現(xiàn)這里也可以用來轉(zhuǎn)換字符胡燦
}
}
/*
結(jié)果如下:
-----------append() capacity() length()-------------
stringBuffer容量為: stringBuffer.capacity()=16
stringBuffer輸出默認(rèn)為字符串: h1hello
stringBuffer容量為: stringBuffer.capacity()=16
stringBuffer字符串長(zhǎng)度為: stringBuffer.length()=7
-------------trimToSize()--------------------
stringBuffer容量為: stringBuffer.capacity()=7
stringBuffer字符串長(zhǎng)度為: stringBuffer.length()=7
-------------reverse()---------------------
原先的stringBuffer為: h1hello
stringBuffer.reverse(): olleh1h
這時(shí)候的stringBuffer為: olleh1h
-------------subString()---------------------
stringBuffer: h1hello
stringBuffer.subString(2): hello
*/
還有兩個(gè)有意思的:
StringBuffer的容器擴(kuò)充方法沒找到,只能大概推出來是這樣的規(guī)則
// 0--16 1--17 8--24 14-30 15-31 16--32 18--34
// 注:如果初始化new StringBuffer() 默認(rèn)是16 .append() 容量一直不變 直到為16 這時(shí)候擴(kuò)充到(16+1)*2=34
// 如果初始化new String("123") 則默認(rèn)capacity是3+16 以此類推
關(guān)于replace():
StringBuffer stringBuffer=new StringBuffer();
stringBuffer.append("12345677654321");
System.out.println(stringBuffer.replace(1, 3, "1234"));// 1--1234-45677654321
// 后邊的是顯示結(jié)果:
"1234"替代了stringBuffer的1、2號(hào)位"23"。
也就是
"23"<--"1234"
好了就到這里了。
呃,好像有點(diǎn)亂。
忽然發(fā)現(xiàn)看源碼挺好的,
直接看String和StringBuffer的源碼里面,這些方法是怎么實(shí)現(xiàn)的。
下面把Python爬蟲整理下,
那時(shí)候不會(huì)寫博客,不會(huì)用Markdown,排版不忍直視。o(╯□╰)o
之前電腦還原了一次,Python筆記丟失部分,無奈。
-- 補(bǔ)充 --
StringBuffer和StringBuilder都可以動(dòng)態(tài)修改字符串,StringBuilder有速度優(yōu)勢(shì),但是StringBuffer是線程安全的。
所以如果用了線程的話,最好用StringBuffer。