为什么==返回true?

问题描述:

为什么这个条件返回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

由于Java有一个唯一的interned实例池,并且String文字存储在此池中。这意味着第一个“hi”字符串字面值与第二个“hi”字面值完全相同。

+0

简单,重点突出。 +1。 – Perception 2012-02-19 17:46:00

当你分配给字符串字面变量,你很可能得到引用同一个对象,以字符串缓存和不变的,所以这些字符串实际上具有相同的参考。

+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

您已将var1和var2声明为int而不是String。

我的编译器拒绝编译代码,说“不兼容的类型”。

您的编译器可能会将字符串“hi”转换为某个数字,例如0,因为这些变量应该有数字值。

+0

好的,你编辑了答案,这不再有效。 – abresas 2012-02-19 17:28:59

将字符串文字分配给字符串时,该文字将作为字符串实例存储到内存中。进一步分配相同的文字将指向相同的内存位置。因此,如果var1var2被声明为String类型,则var1 == var2将返回true,因为它们指向相同的String实例"hi"

参照jvm specifcation

字符串文字(或更一般地说是常量表达式的值(§15.28))的字符串“interned”,以便使用方法String.intern共享唯一实例。

它成真因为如此 http://java.sun.com/docs/books/jls/third_edition/html/lexical.html#3.10.5 大部分的答案在这里已经指出你进入正确的方向,但它是更好的阅读真理的来源。