2012-09-28 29 views
0

我的代碼是:Java的:String引用了意外輸出

String str = "Hello"; 
String str1; 
str1 = str; 
str1 = str1 + " World"; 
System.out.println(str1); 
System.out.println(str); 

我得到的輸出是:

Hello World 
Hello 

因爲根據我的理解,我期待的輸出是Hello World爲兩種情況str1 = str後兩個對象都引用相同的位置,所以如果我改變其他對象的內容也應該受到影響。

因此,是str1 = str1 + " World";在不同的內存loction上創建一個新的字符串對象。

回答

7

字符串是不可變的。當你做str1 = str1 + " World";時,你正在創建一個全新的String並更新str1對它的引用。你永遠不會重新排列str,所以這是預期的行爲。

+0

感謝您的回答。 – RanRag

3

在Java中String是不可變的。

str1 = str1 + " World";它將創建一個新實例並分配給str1。

4

問題是,+運算符創建一個新的String對象,有效地連接操作數。它不會修改對象str

您可能想要閱讀http://javarevisited.blogspot.co.at/2010/10/why-string-is-immutable-in-java.html,它很好地解釋了不可變字符串的概念。

StringBuffer也可能值得注意,這是優化長串級連接。

+0

有趣的博客文章。感謝它。 – RanRag

+0

這真的是第一個針對'java string immutable'的google hit;) –

3

java.lang.String中是不可變的

str1 = str1 + " World"; 

此代碼將使STR1參考到一個新創建的String對象"Hello World",和STR仍參照"Hello"對象。

1

不,這是你已經初始化字符串中的代碼把作爲右出

String str = "Hello"; 
String str1; 

那你說

str1 = str; 

這意味着str1包含 「你好」

str1 = str1 + " World"; 

上面的行會打印出「Hello World」,因爲str1有「Hello」和「World」給出有一個新的字符串

,當你打印str它含有

System.out.println(str); 
2

參考原始datetypes總是創建一個新的對象

0

什麼特別之處串詞「你好」在這裏,這是所有人的共同行爲。這是關於賦值運算符(在第4行中,您再次賦值)。您的代碼與下面類似。

Person p1 = new Person("Stack"); 
Person p2; 
p2 = p1; 
p1 = new Person("OverFlow"); 

什麼打印?都會打印「溢出」?

從你的話。

我所期待的輸出,因爲根據後STR1我的理解 是世界您好用於兩種情況= STR兩個對象 引用到同一位置所以如果我改變一個對象的內容 其他應也受到影響。

Line 3: str1 = str; 

按3號線,你是正確的。

Line 4: str1 = str1 + " World"; 

但行號4不想更改的內容,你是重新分配到STR1不同的對象。

這裏str,str1和p1是對象引用。不是真實的物體。如果您要更改對象,您將獲得相同的內容。像

p1 = p1.setName(「Overflow」);