Java 使用'==';用绳子?(爪哇)

Java 使用'==';用绳子?(爪哇),java,string,equals,equality,sign,Java,String,Equals,Equality,Sign,为什么第一个计算为假,第二个计算为真 在这里您可以找到更多信息:equals()方法比较字符串的内容,==比较Java中的引用。==如果对象本身具有相同的地址,则返回true。出于空间和效率的原因,重复的文本被优化为使用相同的地址。第二个str1和str2等于相同的地址,因此=返回true 在第一个示例中,由于使用new关键字显式声明内存,str1和str2没有相同的地址。因此,str1==str2的计算结果为false 测试相等性时,使用String.equals()函数。因此,str1.eq

为什么第一个计算为假,第二个计算为真


在这里您可以找到更多信息:

equals()方法比较字符串的内容,==比较Java中的引用。

==
如果对象本身具有相同的地址,则返回true。出于空间和效率的原因,重复的文本被优化为使用相同的地址。第二个
str1
str2
等于相同的地址,因此
=
返回true

在第一个示例中,由于使用
new
关键字显式声明内存,
str1
str2
没有相同的地址。因此,
str1==str2
的计算结果为
false


测试相等性时,使用
String.equals()函数。因此,
str1.equals(str2)//true

它在Java内存模型中

当您使用关键字
new
比较两个不同对象的两个不同引用时,第一个等式语句返回false,该关键字将堆内的内存空间分配到两个不同的内存地址,几秒钟后,JVM将分配内存空间一次“进入堆栈”(来自Java 7,它们也在堆中),编译器通过使两个变量指向相同的内存空间来优化内存使用,这说明相等结果是
真的

这里有一篇关于堆、堆栈等的有趣阅读


Cheers

不像C.(==)比较java字符串变量的引用。它比较字符串存储的两个地址。两个按值比较,需要使用string1.equals(string2)是的,但是你没有回答这个问题。他没有使用compare方法Well只是指出了equals和==之间的区别,因为他的问题很令人困惑。谢谢你的努力编译器可能优化了第二个字符串,并将它们放在同一个对象中。因为字符串是不可变的,所以这样做没有什么害处前两个字符串的构造函数被显式调用,因此创建了新对象,很可能它们的内部指针也指向前两个字符串所在的位置。@泰勒:这是否意味着Java在声明新字符串时实际上在内存中搜索相同的字符串?因此,当声明
str2
时,它会发现
str1
是否等于它并因此将其设置为相同的地址?@dokaspar在文档中查找
String.intern();
函数。我不完全确定每个JDK是如何精确地实现内部调用的,但它应该是这样的。记住,只有文本被内部调用,而不是新对象。@dokaspar我认为它取决于实现,什么字符串真正“相同”,但在这种情况下,它是由编译器完成的:它会看到字符串四次(在构造函数调用中两次),并将它们存储在类文件的常量池中一次。因此在运行时不进行查找,类文件多次引用同一字符串(常量,而不是对象)。读者练习:不同类文件中相同的字符串文字是否相同?(好的,所以我测试了它…至少在OpenJDK 7上,它们看起来是一样的。我要说的是类加载器将类文件的常量池与插入的字符串相匹配)这个答案并不完全正确:Java语言规范要求字符串文本被插入,这意味着它们不能在堆栈上分配。您的评论从Java 7开始就对了,谢谢,实际上,从Java 1.0开始就是这样的,例如,请参阅
String str1 = new String("I love programming");
String str2 = new String("I love programming");
boolean boo = str1 == str2; // evaluates to false

String str1 = "I love programming";
String str2 = "I love programming";
boolean boo = str1 == str2; // evaluates to true