String與StringBuffer的理解分析

String   s   ;  
  每次對s進行賦值操作是都將生成一個新的String實例;  
  StingBuffer   sb;  
  sb則不然,它始終是同一個實例  
  所以在經常動態的改變字符串的值是用StingBuffer效率比較高,java生成一個實例的代價較大。

--------------------------------------------------------------------------

也許需要了解一下他們工作時在   堆和棧   的不同.  
    每一個   String值都是一個對象,在內存中的地址是相對唯一的.  
    對一個String值的改動也就是新創建了一個對象.  
     
    而每一個StingBuffer值可以進行append,insert,reverse,setCharAt,and   setLength等操作   但他始終是一個對象,沒有產生新對象.

---------------------------------------------------------------------------

public   class   Foo   {  
        public   static   void   main(String[]   args)     {  
              StringBuffer   a   =   new   StringBuffer("A");              
              StringBuffer   b   =   new   StringBuffer("B");  
              operate(a,b);  
              System.out.println(a   +   ","   +b);  
  }  
    static   void   operate(StringBuffer   x,   StringBuffer   y)     {  
              x.append(y);  
              y   =   x;  
    }  
    }  
  A.“AB,B”  B.“A,B”       C.“AB,A”    D.“AB,AB”  

正確答案選:A

爲什麼選A?

static   void   operate(StringBuffer   x,   StringBuffer   y)     {  
              x.append(y);  
              y   =   x;  
    }  
    }  
  在java中都是傳值調用,調用上面這個子函數的時候,只不過是把對象的地址傳送過來,然後在這段子函數中新生成一個引用來指向那個對象,如果用新的引用來改變對象的內容的話,跟用原來的舊對象引用改變對象內容效果是一樣的.  
  在函數返回的時候,這個新的引用會同時銷燬,但是它並沒有一個往回賦值的動作,也就是說舊的引用還是原來那個對象. 

y=x這句話其實就是一點用處都沒有。也是這到題主要考的知識點吧。  
  y在這裏只是一個臨時的局部變量,它裏面的值只是y這個對象的地址值。如果你在這裏對y進行了操作,那麼相應的object也會進行操作,但是單純的y=x只是把x的地址負值給y而已。當方法運行結束的時候,y就被釋放了,也就沒有意義了。


本文來自CSDN博客,轉載請標明出處:http://blog.csdn.net/lu7kang/archive/2009/05/08/4160997.aspx

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章