爲什麼這個條件返回true,正如我們所知==如果兩個變量具有相同的引用,則返回true,但這裏的引用不相同,但它仍然進入循環並打印Hello World。爲什麼==返回true?
String var1="hi";
String var2="hi";
if(var1==var2){
System.out.println("Hello World");
}
爲什麼這個條件返回true,正如我們所知==如果兩個變量具有相同的引用,則返回true,但這裏的引用不相同,但它仍然進入循環並打印Hello World。爲什麼==返回true?
String var1="hi";
String var2="hi";
if(var1==var2){
System.out.println("Hello World");
}
由於Java有一個唯一的interned實例池,並且String文字存儲在此池中。這意味着第一個「hi」字符串字面值與第二個「hi」字面值完全相同。
簡單,重點突出。 +1。 – Perception 2012-02-19 17:46:00
當你分配給字符串字面變量,你很可能得到引用同一個對象,以字符串緩存和不變的,所以這些字符串實際上具有相同的參考。
另一方面,如果你聲明'var2 = new String(「hi」)',該檢查將返回'false',如你所期望的。 – 2012-02-19 17:28:59
只要滿足平等合同,您就*保證*獲得相同的字符串文字參考。並非所有的字符串都被緩存,只有文字和明確的「被禁止」字符。 – Perception 2012-02-19 17:34:39
@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
您已將var1和var2聲明爲int而不是String。
我的編譯器拒絕編譯代碼,說「不兼容的類型」。
您的編譯器可能會將字符串「hi」轉換爲某個數字,例如0,因爲這些變量應該有數字值。
好的,你編輯了答案,這不再有效。 – abresas 2012-02-19 17:28:59
將字符串文字分配給字符串時,該文字將作爲字符串實例存儲到內存中。進一步分配相同的文字將指向相同的內存位置。因此,如果var1
和var2
被聲明爲String類型,則var1 == var2
將返回true
,因爲它們指向相同的String實例"hi"
。
字符串文字(或更一般地說是常量表達式的值(§15.28))的字符串「interned」,以便使用方法String.intern共享唯一實例。
它成真因爲如此 http://java.sun.com/docs/books/jls/third_edition/html/lexical.html#3.10.5 大部分的答案在這裏已經指出你進入正確的方向,但它是更好的閱讀真理的來源。
這段代碼甚至不應該編譯。 – 2012-02-19 17:24:43
哦..對不起,這是我的錯誤,現在編輯.. :) – Parth 2012-02-19 17:26:50