代码之家  ›  专栏  ›  技术社区  ›  Mansour

Java检查字符串的相等性

  •  -2
  • Mansour  · 技术社区  · 9 年前

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

    public class Main {    
        public static void main(String[] args) {        
            String s1 = "string";
            String s2 = "string";
            System.out.println(""+(s1==s2));
        }
    }
    
    4 回复  |  直到 9 年前
        1
  •  3
  •   nalply Gagan    9 年前

    Java 8和 s1==s2 始终打印 true 在这种情况下,因为它们都指向常量池中的相同内存位置,而常量池通常位于堆内存上。

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

        2
  •  1
  •   RamanSB    9 年前

    没有任何更改,==运算符检查两个引用是否指向同一对象。字符串文本放在字符串池中。因此,“string”被放置在字符串池中,s1和s2都指向它,因此输出为true。

        3
  •  1
  •   Community Mike Kinghan    7 年前

    在编辑的问题中,您定义了两个 字符串常量 根据 JLS § 3.10.5 这些文字是 被拘留的 :

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

    因此,参考等式使用 == 将始终返回 true 对于 s1 == s2 哪里:

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

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

    注意,在某些JDK版本之间,字符串间的工作方式存在一些细微的差异。例如,请参见 "intern() behaving differently in Java 6 and Java 7"

        4
  •  0
  •   Limnic    9 年前

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

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