2012-02-19 215 views
0

爲什麼這個條件返回true,正如我們所知==如果兩個變量具有相同的引用,則返回true,但這裏的引用不相同,但它仍然進入循環並打印Hello World。爲什麼==返回true?

String var1="hi"; 
String var2="hi"; 

if(var1==var2){ 
    System.out.println("Hello World"); 
} 
+6

這段代碼甚至不應該編譯。 – 2012-02-19 17:24:43

+2

哦..對不起,這是我的錯誤,現在編輯.. :) – Parth 2012-02-19 17:26:50

回答

12

由於Java有一個唯一的interned實例池,並且String文字存儲在此池中。這意味着第一個「hi」字符串字面值與第二個「hi」字面值完全相同。

+0

簡單,重點突出。 +1。 – Perception 2012-02-19 17:46:00

4

當你分配給字符串字面變量,你很可能得到引用同一個對象,以字符串緩存和不變的,所以這些字符串實際上具有相同的參考。

+2

另一方面,如果你聲明'var2 = new String(「hi」)',該檢查將返回'false',如你所期望的。 – 2012-02-19 17:28:59

+1

只要滿足平等合同,您就*保證*獲得相同的字符串文字參考。並非所有的字符串都被緩存,只有文字和明確的「被禁止」字符。 – Perception 2012-02-19 17:34:39

+1

@Perception而不僅僅是字符串文字,而是編譯器標識爲常量的任何字符串。例如,「one2」==「one」+ 2「。 (請參閱:http://java.sun.com/docs/books/jls/third_edition/html/lexical.html#3.10.5)@ParthSoni,你想要檢查什麼 - 身份平等或「邏輯」平等?後者可以使用'String.equals'或'String.equalsIgnoringCase'。 – yshavit 2012-02-19 17:44:54

0

您已將var1和var2聲明爲int而不是String。

我的編譯器拒絕編譯代碼,說「不兼容的類型」。

您的編譯器可能會將字符串「hi」轉換爲某個數字,例如0,因爲這些變量應該有數字值。

+0

好的,你編輯了答案,這不再有效。 – abresas 2012-02-19 17:28:59

2

將字符串文字分配給字符串時,該文字將作爲字符串實例存儲到內存中。進一步分配相同的文字將指向相同的內存位置。因此,如果var1var2被聲明爲String類型,則var1 == var2將返回true,因爲它們指向相同的String實例"hi"

0

參照jvm specifcation

字符串文字(或更一般地說是常量表達式的值(§15.28))的字符串「interned」,以便使用方法String.intern共享唯一實例。

相關問題