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