编辑:我在java中测试了这段代码,打印输出是" true" ,而编译器比较了引用而不是值为什么这是"真的"?
public class Main {
public static void main(String[] args) {
String s1 = "string";
String s2 = "string";
System.out.println(""+(s1==s2));
}
}
答案 0 :(得分:3)
在这种情况下,字符串相等规则在Java 8中没有改变,s1==s2
始终打印true
,因为它们都指向常量池中的相同内存位置,常常位于堆内存中。
我刚用Java6检查过,这是真的。
答案 1 :(得分:1)
没有变化,==运算符检查两个引用是否指向同一个对象。字符串文字放在字符串池中。所以“string”放在字符串池中,s1和s2都指向它,因此输出为true。
答案 2 :(得分:1)
在您编辑的问题中,您已定义了两个字符串文字。根据{{3}},这些文字 interned :
字符串文字始终引用类String的相同实例。这是因为字符串文字 - 或者更常见的是作为常量表达式(第15.28节)的值的字符串 - 被“实例化”以便使用String.intern方法共享唯一实例。
因此,使用==
的引用相等性始终会为true
返回s1 == s2
,其中:
String s1 = "string";
String s2 = "string";
JLS对JLS § 3.10.5和Java 7
表示(几乎完全相同)请注意,某些JDK版本之间的字符串实习方式存在一些细微差别。例如,请参阅Java 6
答案 3 :(得分:0)
在这种情况下,由编译器决定是否s1 == s2
。条件是测试s1
和s2
是否是同一个对象。这可能是真的,因为合理的编译器会有一个恒定的池,但不一定如此。
但是,您的意图是比较字符串而不是对象,因此equals()
是正确的方法,并且==的使用不正确。