为什么==返回true?
为什么这个条件返回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"
。
它成真因为如此 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