天天看點

String 和 StringBuffer的差別

public class Test {

public static void stringReplace (String text) {

text = text.replace('j' , 'i');

}

public static void bufferReplace (StringBuffer text) {

text = text.append("C");

}

public static void main (String args[]) {

String textString = new String ("java");

StringBuffer textBuffer = new StringBuffer ("java");

stringReplace (textString);

bufferReplace (textBuffer);

System.out.println (textString + textBuffer);

}

}

答案是 javajavaC

這是Java參數傳遞(by value)造成的,是不可變的(immutable).,例如 基本類型,String傳值,複制了值傳遞過去;可變的(Object)傳值,複制了引用傳遞過去。

而題目中第七行text = text.append (“C”),append方法會改變text中的值

而這個text與main中的textBuffer是指向同一個對象,是以對應的輸出是javac。

string的值永遠不會改變!

String a = "a";//假設a指向位址0x0001,

a = "b";//重新負值後a指向位址0x0002,但0x0001位址中儲存的"a"依舊存在,但已經不再是a所指向的。

從表面上看String類型的對象改變了值,但事實是他不能改變值,隻能改變指向的位址

StringBuffer則不同,直接改變指向的位址中保留的值

還有

StringBuffer s1 = new StringBuffer("a");

StringBuffer s2 = new StringBuffer("a");

s1.equals(s2)//為什麼是false

String s1 = new String("a");

String s2 = new String("a");

s1.equals(s2)//為什麼是true

StringBuffer類中沒有重新定義equals這個方法,是以這個方法就來自Object類,

而Object類中的equals方法是用來比較位址的,是以等于false.

String類中重新定義了equals這個方法,而且比較的是值,而不是位址。是以會是

true。