這是好友面試的一道題,其實(shí)我知道使用的區(qū)別,StringBuffer必須new出來(lái),StringBuffer的append的效率比string的+=的效率高, 其實(shí)發(fā)現(xiàn)還有很大的區(qū)別,看了看以前scjp的考題 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參數(shù)傳遞(by value)造成的,是不可變的(immutable).,例如 基本類(lèi)型,String傳值,復(fù)制了值傳遞過(guò)去;可變的(Object)傳值,復(fù)制了引用傳遞過(guò)去。
而題目中第七行text = text.append (“C”),append方法會(huì)改變text中的值 而這個(gè)text與main中的textBuffer是指向同一個(gè)對(duì)象,所以對(duì)應(yīng)的輸出是javac。 string的值永遠(yuǎn)不會(huì)改變!
String a = "a";//假設(shè)a指向地址0x0001, a = "b";//重新負(fù)值后a指向地址0x0002,但0x0001地址中保存的"a"依舊存在,但已經(jīng)不再是a所指向的。 從表面上看String類(lèi)型的對(duì)象改變了值,但事實(shí)是他不能改變值,只能改變指向的地址
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類(lèi)中沒(méi)有重新定義equals這個(gè)方法,因此這個(gè)方法就來(lái)自O(shè)bject類(lèi), 而Object類(lèi)中的equals方法是用來(lái)比較地址的,所以等于false.
String類(lèi)中重新定義了equals這個(gè)方法,而且比較的是值,而不是地址。所以會(huì)是 true。 對(duì)于這樣能不能面試出真正的水平,感到懷疑。 |
posted on 2006-03-02 13:54
badboy 閱讀(802)
評(píng)論(0) 編輯 收藏 所屬分類(lèi):
Java基礎(chǔ)