繁体   English   中英

Java 检查字符串的相等性

[英]Java check equality for Strings

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

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

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

我刚刚检查了 Java6,这是真的。

没有变化,== 运算符检查两个引用是否指向同一个对象。 字符串文字被放置在字符串池中。 所以“字符串”被放置在字符串池中,s1 和 s2 都指向那个,因此输出为真。

在您编辑的问题中,您定义了两个String 文字 根据JLS § 3.10.5这些文字是实习的

字符串字面量总是指类 String 的同一个实例。 这是因为字符串文字 - 或者更一般地说,作为常量表达式(第 15.28 节)的值的字符串 - 使用 String.intern 方法被“嵌入”以便共享唯一实例。

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

String s1 = "string";
String s2 = "string";

JLS 声明(几乎完全相同)对于Java 7Java 6

但请注意,某些 JDK 版本之间的字符串实习工作方式存在一些细微差别。 例如,参见“intern() 在 Java 6 和 Java 7 中的行为不同”

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM