【问题标题】:String equals and == with String concatenation [duplicate]字符串等于和 == 与字符串连接 [重复]
【发布时间】:2023-04-06 09:02:02
【问题描述】:

我试图用字符串比较的输出来理解字符串连接。需要明确的是,我有一个类来使用 == 和 equals 比较两个字符串。我正在尝试将 == 和 equals() 的输出连接到一个字符串。 equals() 的输出连接,但 == 的输出不 连接。使用 java 的装箱功能,与字符串连接的布尔值将联系。据我所知,equals 和 == 返回布尔值。那么为什么会有这种差异呢?谁能解释一下?

public class StringHandler {

    public void compareStrings() {
        String s1 = new String("jai");
        String s2 = "jai";
        String s3 = "jai";
        System.out.println("Object and literal compare by double equal to :: "
                + s1 == s2);
        System.out.println("Object and literal compare by equals :: "
                + s1.equals(s2));
        System.out
                .println("Literal comparing by double equal to :: " + s2 == s3);
        System.out.println("Literal comparing by equals :: " + s2.equals(s3));
    }

    public static void main(String[] args) {
        StringHandler sHandler = new StringHandler();
        sHandler.compareStrings();
    }
}

输出

false
Object and literal compare by equals :: true
false
Literal compareing by equals :: true

更新:回答

如果 s1==s2 没有括号,JVM 会将字符串比较为“Object and literal compare by double equal to :: jai”== “jai”,结果为 false。所以 sysout 中的实际内容不会被打印出来。添加括号时,JVM 将字符串与 "jai" == "jai" 进行比较,结果为

Object and literal compare by double equal to :: true

【问题讨论】:

  • 字符串被“吞下”不是很重要吗?

标签: java string equals string-concatenation


【解决方案1】:

问题:

+ s2 == s3

+ 符号比 == 具有更高的优先级,因此它会在执行 == 之前先执行(append)它因此只给你"false"

您需要加上括号,以便它检查您的字符串比较的结果。

parenthesis 也有比+ 更高的precedence 符号,它会先比较字符串,然后再将其附加到字符串。

样本

 System.out.println("Object and literal compare by double equal to :: " + (s1==s2));
    System.out.println("Object and literal compare by equals :: " + (s1.equals(s2)));
    System.out.println("Literal compareing by double equal to :: " + (s2 == s3));
    System.out.println("Literal compareing by equals :: " + (s2.equals(s3)));

运算符优先级:

【讨论】:

    【解决方案2】:

    添加括号!

      System.out.println("Object and literal compare by double equal to :: " +
                         (s1 == s2));
    

    PLus 和其他算术运算的优先级高于比较运算。使用 '+' 表示 concat 不会改变这一点。

    【讨论】:

      【解决方案3】:

      当你这样做时

      System.out.println("Object and literal compare by double equal to :: "
                  + s1 == s2);
      

      您首先将字符串"Object and literal compare by double equal to :: " 与字符串s1 连接起来,这将给出

      "Object and literal compare by double equal to :: jai"
      

      然后,您正在检查此字符串是否与s2 是同一对象(同一引用):

      "Object and literal compare by double equal to :: jai" == "jai"
      

      这将是false(输出将是false)。

      换句话说,这是因为运算符优先。 “操纵”先验运算符的一种方法是使用括号。括号内的操作会先被解析:

      System.out.println("Object and literal compare by double equal to :: " + (s1 == s2));
      

      【讨论】:

        【解决方案4】:

        这是一个操作顺序问题。它被解释如下(添加括号):

        System.out.println(("Object and literal compare by double equal to :: " + s1)  == s2);
        System.out.println("Object and literal compare by equals :: " + (s1.equals(s2)) );
        System.out.println(("Literal compareing by double equal to :: " + s2)  == s3);
        System.out.println("Literal compareing by equals :: " + (s2.equals(s3)) );
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-08-29
          • 2013-11-30
          • 1970-01-01
          • 2019-10-24
          • 2013-08-26
          • 2010-09-12
          • 2015-01-11
          相关资源
          最近更新 更多