Java 为什么==返回true?

Java 为什么==返回true?,java,conditional-statements,Java,Conditional Statements,为什么这个条件返回true,正如我们所知,如果两个变量都有相同的引用,那么==返回true,但这里的引用不相同,但它仍然进入循环并打印Hello World String var1="hi"; String var2="hi"; if(var1==var2){ System.out.println("Hello World"); } 当您将字符串文字指定给变量时,很可能会获得对同一对象的引用,因为字符串是缓存的且不可变的,因此这些字符串实际上具有相同的引用。您已将var1和var2声

为什么这个条件返回true,正如我们所知,如果两个变量都有相同的引用,那么==返回true,但这里的引用不相同,但它仍然进入循环并打印Hello World

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

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

当您将字符串文字指定给变量时,很可能会获得对同一对象的引用,因为字符串是缓存的且不可变的,因此这些字符串实际上具有相同的引用。

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

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


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

因为Java有一个唯一实例池,并且字符串文本存储在此池中。这意味着第一个“hi”字符串文字与第二个“hi”文字是完全相同的字符串对象。

当您将字符串文字指定给字符串时,该文字将作为字符串实例存储到内存中。相同文字的进一步赋值将指向相同的内存位置。因此,如果
var1
var2
被声明为字符串类型,那么
var1==var2
将返回
true
,因为它们指向相同的字符串实例
“hi”

请参阅


字符串文本,或者更一般地说,常量表达式(§15.28)的值字符串,使用String.intern方法“interned”以共享唯一实例。正是因为如此
这里的大多数答案已经为您指明了正确的方向,但最好阅读《真理之源》。

这段代码甚至不应该编译。哦。。对不起,这是我的错,现在编辑:)另一方面,如果您声明
var2=new String(“hi”)
,则检查将按预期返回
false
。只要字符串文本满足相等约定,您*保证*获得相同的引用。并不是所有的字符串都被缓存,只有文本和显式
插入的
字符串被缓存,而不仅仅是字符串文本,而是编译器识别为常量的任何字符串<例如,代码>“one2”==“one”+2
。(请参阅:)@ParthSoni,你想检查什么——身份平等,还是“逻辑”平等?对于后者,可以使用
String.equals
String.equalSigningCase
。@yshavit-很好,只要涉及的所有字符串都是文本。