Java检查字符串的相等性

Java检查字符串的相等性,java,string,equality,Java,String,Equality,编辑:我已经用java测试了这段代码,打印的输出是“true”,而编译器比较的是引用而不是字符串的值,为什么这是“true” Java 8中的字符串相等规则没有改变,在这种情况下,s1==s2总是打印true,因为它们都指向常量池中的相同内存位置,而常量池通常位于堆内存中 我刚刚用Java6检查过,这是真的。没有变化,==操作符检查两个引用是否指向同一个对象。字符串文本放置在字符串池中。因此“string”被放置在字符串池中,s1和s2都指向该值,因此输出为true。在这种情况下,编译器决定s1

编辑:我已经用java测试了这段代码,打印的输出是“true”,而编译器比较的是引用而不是字符串的值,为什么这是“true”


Java 8中的字符串相等规则没有改变,在这种情况下,
s1==s2
总是打印
true
,因为它们都指向常量池中的相同内存位置,而常量池通常位于堆内存中


我刚刚用Java6检查过,这是真的。

没有变化,==操作符检查两个引用是否指向同一个对象。字符串文本放置在字符串池中。因此“string”被放置在字符串池中,s1和s2都指向该值,因此输出为true。

在这种情况下,编译器决定s1==s2。条件是测试
s1
s2
是否为同一对象。这可能是真的,因为一个明智的编译器会有一个常量池,但不一定如此


但是,您的目的是比较字符串,而不是对象,因此
equals()
是正确的方法,使用==是不正确的。

在您编辑的问题中,您定义了两个字符串文本。根据这些文字,这些文字被拘留:

字符串文本始终引用类字符串的同一实例。这是因为字符串文字(或者更一般地说,是常量表达式(§15.28)的值的字符串)被“插入”,以便使用string.intern方法共享唯一实例

因此,对于
s1==s2
,使用
=
的引用等式将始终返回
true
,其中:

String s1 = "string";
String s2 = "string";
JLS对和的说明(几乎完全相同)


但是请注意,在某些JDK版本之间,字符串内部处理的工作方式存在一些细微的差异。请看,例如,java 7也将打印
true
@a_horse_,其名称可能与常量池一起玩:)您的java 6 JRE是来自Sun/Oracle还是其他JRE?好的,谢谢大家。我错了。我用这两条语句替换了语句“System.out.println(“+(s1==s2));”,结果是“false”。谢谢String s3=“stringstring”;System.out.println(“+(s3==s1+s2));好的,谢谢。我错了。我用这两条语句替换了语句“System.out.println(“+(s1==s2));”,结果是“false”。谢谢String s3=“stringstring”;System.out.println(“+(s3==s1+s2))@Mansur在编辑问题后回答:因为两者都指向常量池中的相同内存位置。没有编译器会维护常量池。JVM确实如此。
String s1 = "string";
String s2 = "string";