【问题标题】:How are the == operator and .equals for strings in java the same? [duplicate]java中字符串的==运算符和.equals如何相同? [复制]
【发布时间】:2013-02-11 17:03:14
【问题描述】:

我是这个网站的新手,没有意识到还有其他问题可以回答我的问题。我已经想通了,我会尽快删除这篇文章。谢谢你。

我刚开始重新学习 java,我有一个简单的问题。

通常,使用 == 来比较字符串是行不通的,您必须改用 .equals。

但现在在编码时,我发现他们在不应该做同样的事情时也在做同样的事情,我正试图找出原因。

这是代码。

String s = "Hello";
   String x = "Hello";

   if (x == s){
       System.out.println("It is working!");
   }//end if
   else {
       System.out.println("It is not working");
   }//end else

   if (x.equals(s)){
       System.out.println("Match");
   }//end if
   else {
       System.out.println("No match");
   }//end else

【问题讨论】:

  • 干得好,OP,您提出了本网站上最常见的问题。它列在java 标签本身的“常见问题”下(当然是第一个条目)。
  • 对不起。我没有意识到还有其他所有问题都回答了我的问题。我刚加入这个网站,我会尽快删除这个帖子。不过谢谢。

标签: java string if-statement


【解决方案1】:

基本上你会看到字符串实习的结果。来自section 15.28 of the JLS

使用 String.intern 方法,String 类型的编译时常量表达式始终是“内部”的,以便共享唯一的实例。

所以你的两个变量值实际上是指相同的字符串。如果你使用:

String s = new String("Hello");
String x = new String("Hello");

...然后你会看到你期望的行为。

【讨论】:

    【解决方案2】:

    原因是您的变量 x 和 s 具有相同的引用,因此 == 的行为与 .equals 相同。

    当 Java 编译器优化您的字符串值(文字)时,它会确定 x 和 s 具有相同的值,因此您只需要一个 String 对象。结果,x 和 s 都指向同一个 String 对象,并且节省了一些内存。这是安全的操作,因为 String 在 Java 中是不可变的对象。

    【讨论】:

      【解决方案3】:

      好吧,在这种特殊情况下,只有一个字符串对象被创建并缓存在字符串常量池中,并且两个引用变量都指向同一个存储在字符串常量池中的字符串对象。因此你 == 测试通过

      字符串 s = "你好"; 1号线 字符串 x = "你好"; 2号线

      当执行第 1 行时,一个字符串对象 (Hello) 被创建并缓存在字符串常量池中。

      **String Constant Pool:** {s--->"Hello"}
      

      在执行第2行时,它首先检查字符串常量池中是否有任何具有相同值的对象,如果存在的话。它只是将引用指向池中已创建的对象。

      **String Constant Pool:** {s,x--->"Hello"}
      

      【讨论】:

        猜你喜欢
        • 2013-02-16
        • 2015-10-20
        • 2022-12-14
        • 2011-01-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多