Posted on 2011-05-03 16:02
哈希 閱讀(203)
評論(0) 編輯 收藏 所屬分類:
java 代碼
string和stringbuffer區(qū)別
這是好友面試的一道題,其實我知道使用的區(qū)別,StringBuffer必須new出來,StringBuffer的append的效率比string的+=的效率高,
其實發(fā)現(xiàn)還有很大的區(qū)別,看了看以前scjp的考題

Test
1 public class Test {
2 public static void stringReplace (String text) {
3 text = text.replace('j' , 'i');
4 }
5
6 public static void bufferReplace (StringBuffer text) {
7 text = text.append("C");
8 }
9
10 public static void main (String args[]) {
11 String textString = new String ("java");
12 StringBuffer textBuffer = new StringBuffer ("java");
13
14 stringReplace (textString);
15 bufferReplace (textBuffer);
16
17 System.out.println (textString + textBuffer);
18 }
19 }
答案是 javajavaC
這是Java參數(shù)傳遞(by value)造成的
而題目中第七行text = text.append ("C"),append方法會改變text中的值
而這個text與main中的textBuffer是指向同一個對象,所以對應(yīng)的輸出是javac。
string的值永遠不會改變!
String a = "a";//假設(shè)a指向地址0x0001,
a = "b";//重新負值后a指向地址0x0002,但0x0001地址中保存的"a"依舊存在,但已經(jīng)不再是a所指向的。
從表面上看String類型的對象改變了值,但事實是他不能改變值,只能改變指向的地址
StringBuffer則不同,直接改變指向的地址中保留的值
還有
public static void main(String[] args) {
StringBuffer s1 = new StringBuffer("a");
StringBuffer s2 = new StringBuffer("a");
s1.equals(s2);//為什么是false
System.out.println(s1.equals(s2));
String s3 = new String("a");
String s4 = new String("a");
s3.equals(s4);//為什么是true
System.out.println(s3.equals(s4));
}
StringBuffer類中沒有重新定義equals這個方法,因此這個方法就來自O(shè)bject類,
而Object類中的equals方法是用來比較地址的,所以等于false.
String類中重新定義了equals這個方法,而且比較的是值,而不是地址。所以會是
true。