字符串的Java检查相等

时间:2015-09-15 10:12:13

标签: java string equality

编辑:我在java中测试了这段代码,打印输出是" true" ,而编译器比较了引用而不是值为什么这是"真的"?

public class Main {    
    public static void main(String[] args) {        
        String s1 = "string";
        String s2 = "string";
        System.out.println(""+(s1==s2));
    }
}

4 个答案:

答案 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.5Java 7

表示(几乎完全相同)

请注意,某些JDK版本之间的字符串实习方式存在一些细微差别。例如,请参阅Java 6

答案 3 :(得分:0)

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

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