StringBuffer、String

介紹

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。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容