2013-10-30 52 views
1

我給一個字符串變量的值(作爲變量)。指針與java和字符串變量

的問題是,當我修改這個值,它不改變其他變量:

代碼

String test = "hello"; 
String myname = test; 
test = "how are you ?"; 

輸出的MYNAME是 「你好」

我希望輸出結果是「你好嗎?」測試的新價值;如何做到這一點,沒有給值又像:

myname = test; 

我不想再給價值,因爲我在我的代碼,我得到了很多的是得到了測試變量值的變量,我想做最短的路。

回答

3

這聽起來像你需要了解引用變量和變量引用的對象之間的區別。讓我們來看看你的代碼做什麼:

String test = "hello"; 

此分配參考變量test指恆定String對象與價值"hello"

String myname = test; 

現在參考myname是指作爲test做同樣String對象。

test = "how are you ?"; 

現在test是指與"how are you ?"的價值String對象。請注意,如您所見,這不會改變myname

+0

當然我明白,那爲什麼林尋求幫助來解決我的問題 – LeSam

+0

@ user2372006也許你問的是錯誤的問題。究竟*是什麼問題? –

2

問題是String是不可變的,因此"how are you ?"是一個新的對象。因此myname仍指老對象"hello"

解決方案1:不要使用兩個引用。如果只有一個對象,爲什麼不在整個代碼中只使用test

解決方案2:讓兩個引用指向相同的對象,但使用可變對象。例如使用StringBuilderStringBuffer而不是String

+0

與StringBuilder相同的代碼將具有完全相同的結果。 –

+0

對於你的解決方案1:我說這只是一個例子,我的代碼確實有很多對象! – LeSam

9

首先你將值「hello」(在內存的某個地方),以test分配:

test --------------> "hello" 

然後,要設置myname在內存中相同位置。

test --------------> "hello" 
       /
myname ----------/ 

然後,你分配值「你好嗎?「在內存位置test

    -> "hello" 
       /
myname ----------/ 

test --------------> "how are you?" 

這是所有關於指針COMMENT

編輯時,

我不知道你的代碼的其餘部分的樣子。 ,但是如果您希望能夠更新單個字符串並同時對該字符串的其餘引用進行更新,則需要使用StringBuilder(或StringBuffer,如果需要同步):

StringBuilder test = new StringBuilder("hello"); 
    StringBuilder myname = test; 
    StringBuilder foo = test; 
    StringBuilder bar = test; 
    test.replace(0, test.length(), "how are you?"); 
    Assert.assertEquals("how are you?", test.toString()); 
    Assert.assertEquals("how are you?", myname.toString()); 
    Assert.assertEquals("how are you?", foo.toString()); 
    Assert.assertEquals("how are you?", bar.toString()); 

從那裏得到它?

+0

是的當然,但如何解決我的問題 – LeSam

+0

謝謝你的回答,我希望它會幫助某人,但我不幸刪除了這個擁有('狐狸'的東西),這是關於使用數組方法。 – LeSam

2

這就是變量的工作原理。變量不是對其他變量的引用。它們是對象的引用。如果您更改某個變量引用的內容,則不會更改其他變量引用的內容。

可以改變,雖然對象的內容:

public class Container { 
    private String value; 
    // setter and getter omitted 
} 

Container test = new Container(); 
test.setValue("hello"); 
Container myname = test; 
test.setValue("how are you ?); 
System.out.println(myname.getValue()); // prints "how are you ?" 
+0

謝謝你的回答,我希望它能幫助別人,但是我不幸地通過這個擁有的('狐狸'東西)刪除了這個答案,這是關於使用數組方法的。 – LeSam

2

您的每一個變量只是一個指針真實對象。所以在第二行之後,兩個變量都指向相同的字符串。在第3行後,test指向其他地方,並且myname仍然指向該字符串。

一旦創建了Java字符串,就無法修改它。

爲了得到你想要的,你可以使用AtomicReference<String>作爲變量的數據類型。您並不需要引用的Atomic部分,但它是嵌入到Java中的最簡單的引用類型。

+0

謝謝你的回答,我希望它會幫助某人,但我不幸刪除了這個擁有的('狐狸'的東西),這是關於使用數組方法。 – LeSam