1. 程式人生 > >String和StringBuffer的區別詳解

String和StringBuffer的區別詳解

1. StringBuffer和String的區別
    * String是一個不可變的字元序列
    * StringBuffer是一個可變的字元序列 
    * 無參構造方法,Sting為空字元初始容量為0,StringBuffer初始容量為16

2.StringBuffer和String的相互轉換
A:String -- StringBuffer
    * a:通過構造方法

    * b:通過append()方法
        //建立一個String物件
        String string="nihao";
        System.out.println(string);


        //方式一:構造方法
        StringBuffer stringBuffer5=new StringBuffer(string);
        System.out.println(stringBuffer5);
        //方式二:通過append方法
        StringBuffer stringBuffer6=new StringBuffer();
        stringBuffer6.append(string);
        System.out.println(stringBuffer6);
B:StringBuffer -- String
    * a:通過構造方法
    * b:通過toString()方法
    * c:通過subString(0,length);
        //建立一個StringBuffer物件

        StringBuffer stringBuffer7=new StringBuffer("world");
        System.out.println(stringBuffer7);
        //方式一:通過構造方法
        String string2=new String(stringBuffer7);
        System.out.println(string2);
        //方式二:通過toString方法
        String string3=stringBuffer7.toString();
        System.out.println(string3);

        //方式三:通過subString(0,length);
        String string4=stringBuffer7.substring(0, stringBuffer7.length());
        System.out.println(string4);

3.String和StringBuffer分別作為引數傳遞

A:形式引數問題

    * String作為引數傳遞:傳遞的是引數的地址,隨著方法的結束該地址被回收,原來的物件指向的地址不發生改變,但是方法中的物件指向的地址發生了改變
    * StringBuffer作為引數傳遞 :append方法是根據物件的地址來修改值,不再建立新的物件,因此指向的地址都是一樣的,改地址的值被永久的修改
B:案例演示

    * String和StringBuffer分別作為引數傳遞問題

案例1:

package wbl.test;
public class StringBuffer_Test11
{
public static void main(String[] args)
{
test("word");
StringBuffer stringBuffer=new StringBuffer("nihao");
StringBuffer stringBuffer2=new StringBuffer("shijie");
test1(stringBuffer,stringBuffer2);
System.out.println(stringBuffer+" , "+stringBuffer2 );
}
public static void test(String string )
{
System.out.println(string);
string="niaho";
System.out.println(string);
}
/**
* 方法中stringBuffer=stringBuffer2;stringBuffer指向的是stringBuffer2的地址,
* 所以stringBuffer=shijie;stringBuffer2修改是根據他的地址修改的值,所以該地址的值被永久
* 的修改,方法結束後,stringBuffer不再指向stringBuffer2的地址,而是本身的地址,沒有改變,
* stringBuffer發生了改變為:shijieshijie
* @param stringBuffer
* @param stringBuffer2
*/
public static void test1(StringBuffer stringBuffer ,StringBuffer stringBuffer2)
{
stringBuffer=stringBuffer2;
stringBuffer2=stringBuffer2.append(stringBuffer);
System.out.println(stringBuffer+" , "+stringBuffer2 );
}
}

結果為:

niaho
方法中:shijieshijie , shijieshijie
方法結束後:nihao , shijieshijie

案例2:

package wbl.test;

public class StringAndStringBuffer_qubie
{
    public static void main(String[] args)
    {
        String str1="nihao";
        System.out.println("String作為引數傳遞前:"+str1);
        change(str1, "world");
        System.out.println("String作為引數傳遞後:"+str1);

        StringBuffer sb1=new StringBuffer("world");
        System.out.println("StringBuffer作為引數傳遞前:"+sb1);
        change(sb1, sb1);
        System.out.println("StringBuffer作為引數傳遞後:"+sb1);
    }
    public static void change(String string,String string2)
    {
        string=string2;
        System.out.println("方法中的值為:"+string);
    }
    public static void change(StringBuffer sb1,StringBuffer sb2)
    {
        sb1=sb1.append(sb2);
        System.out.println("方法中的值為:"+sb1);
    }
}

結果:
String作為引數傳遞前:nihao
方法中的值為:world
String作為引數傳遞後:nihao
StringBuffer作為引數傳遞前:world
方法中的值為:worldworld
StringBuffer作為引數傳遞後:worldworl