2017-07-23 78 views
4

我想了解在Java中的參考比較。 假設我們主要有以下代碼:比較字符串引用

public static void main (String args[]) { 
    String str1 = "Love!"; 
    String str2 = "Love!"; 
    String str3 = new String("Love!"); 
    String str4 = new String("Love!"); 
    String str5 = "Lov"+ "e!"; 
    String str6 = "Lo" + "ve!"; 
    String s = "e!"; 
    String str7 = "Lov"+ s; 
    String str8 = "Lo" + "ve!"; 
    String str9 = str1; 
} 

我明白str1 == str2 == str5 == str6 == str8 == str9和所有的人都是一樣的對於公共遊泳池。 (值「愛!」)。 s也是對公共池的引用,但它指的是值「e!」

我也明白str1 != s

我知道str3,str4是對HEAP的引用,它們中的每一個都是不同的對象。 str3 != str4

我不明白爲什麼​​,,我很想得到一個解釋。

+1

如果你「理解」了'str1 == str4',那麼你需要忘記你認爲你知道的東西,因爲它不是。 'str3','str4'和'str7'都是3個獨立的對象。 – Andreas

+0

是的,我的不好。它在堆中。 str3,str4在堆中。對不起 – Romansko

+1

簡單的答案:編譯器會在連接兩個字符串時專門處理它,編譯器知道這些字符串是什麼(因爲它們是字符串文字或「static final」常量)。 's'是一個變量,這就是爲什麼'str7'不屬於這種情況。 – ajb

回答

13

String s = "e!"; 
String str7 = "Lov"+ s; 

雖然"e!"是常量表達式,s中的常量變量(JLS §4.12.4);因此,參考s"Lov" + s不能是常數表達式(JLS §15.28)。爲使像s這樣的變量成爲一個常量變量,它需要既是final,又是從常量表達式初始化的。

如果你寫了

final String s = "e!"; 
String str7 = "Lov" + s; 

然後str1 == str7會一直如此。

+0

很好的解釋,很好的例子!非常感謝你。 – Romansko