2013-03-21 91 views
1

我有一個追加String的情況。而且我很困惑..在Java中添加字符串困惑

public static void foo() { 
     String s = "str4"; 
     String s1 = "str" + s.length(); 
     System.out.println("(s==s1) = " + (s1 == s)); 
    } 

public static void bar() { 
     String s = "str4"; 
     String s1 = "str" + "4"; 
     System.out.println("(s==s1) = " + (s1 == s)); 
    } 

在第一種情況下,正如我在這兩種情況下「STR4」對象瞭解正在被它的返回「假」,但在第二種情況「真正的」 在堆上創建。所以它在兩種情況下都應該返回true。但事實並非如此。 請別人幫我解釋爲什麼這樣。 ?謝謝。!

+0

檢查... http://stackoverflow.com/questions/3801343/what-is-string-pool-in-java – 2013-03-21 06:49:54

回答

3

使用

s1.equals(s) 

比較字符串,否則你比較引用。

在第二種情況下,它返回true因爲String s1 = "str" + "4";將被優化以String s1 = "str4";ss1將引用相同的字符串。

+0

其實我並不需要將對象的內容進行比較,但我想知道如何在堆內存上更改'引用'。如果equals()返回true,則表示內容相同。但在這裏,我的關注只是參考。謝謝。 – Aatif 2013-03-21 06:58:42

+0

@Aatif,所以我的答案已經涵蓋了引用部分./ – 2013-03-21 07:01:09

+0

我還是不清楚Case 1。引用是如何不同的? – Aatif 2013-03-21 07:11:16

0

你需要使用.equals()這個

.equals() // if you dont want to ignore case 

.equalsIgnoreCase() // if you want to ignore case 

==比較引用。

在第二種情況下,兩個字符串是相等的。所以引用也是相等的。

String s = "str4"; 
    String s1 = "str" + "4"; .//finally str4 

這裏s1和s2的內容是相等的。所以它們有相同的參考。

+0

第二種情況對我來說非常明顯,因爲「str4」已經存在並且由's'引用,並且它不是再次在堆上創建的,而是指向到變量's1'。但是它與案例1有什麼不同。 – Aatif 2013-03-21 07:04:31

+0

我還不清楚案例1.引用是如何不同的? – Aatif 2013-03-21 07:09:31

+0

@Aatif抱歉,我無法找到問題 – PSR 2013-03-21 07:12:40

0

Java中的==運算符僅在兩個引用引用同一對象時才返回true。如果您試圖比較兩個字符串的等效內容,則必須使用equals()方法。

+0

我想檢查參考只。但我沒有得到如何在兩種情況下引用是不同的。 ?是因爲s.length()? – Aatif 2013-03-21 07:05:50

0

以我自己的理解:

「STR」=>字符串

「4」=>字符串

然而,

s.length() => int

使用==,比較內存位置。

使用的第一個例子,Java的創建另一字符串,它是不是「S」的位置之外的其他存儲位置,因爲你正在試圖做的字符串+ INT =字符串。

第二個示例返回true,因爲它只是與您的's'相同的內存位置,只是值被更改。字符串+字符串=連接字符串

既然你想比較,如果兩個字符串具有內但不相同的字符必須是同一位置,然後s.equals(S1)是最好的解決方案。

但是,你應該要測試如果兩個變量都指向同一個對象,然後==必須因其淺層比較使用。

+0

謝謝。但是在將'int'附加到String之前,如果您使用的是Java 1.5或更高版本,那麼它會被自動綁定到對象。我認爲int 4也是第一次在這裏被自動裝箱...... – Aatif 2013-03-21 07:22:45