【问题标题】:String concatenation and comparison gives unexpected result in println statement字符串连接和比较在 println 语句中给出了意外的结果
【发布时间】:2015-11-25 11:02:09
【问题描述】:

我无法弄清楚以下行为,

String str1= "abc";
String str2 = "abc";

System.out.println("str1==str2 "+ str1==str2);
System.out.println("str1==str2 " + (str1==str2))

上述语句的输出如下:

str1==str2 真

为什么会这样?为什么输出不如下:

str1==str2 真

str1==str2 真

【问题讨论】:

    标签: java string operator-precedence


    【解决方案1】:

    + has higher precedence than ==.
    所以你的代码:

    System.out.println("str1==str2 " + str1 == str2);
    

    实际上是

    System.out.println(("str1==str2 "+str1) == str2); 
    

    所以,你得到false

    情况 2

    System.out.println("str1==str2 " + (str1==str2));
    

    您已明确使用大括号将str1str2(即true)进行比较,然后附加该值。

    【讨论】:

    • @OP 还有更多关于 Operator Precedence 的信息,请参考这个 java doc
    【解决方案2】:

    传递给 println 的参数从左到右计算。

    因此"str1==str2 "+ str1 连接两个字符串,稍后将它们与str2 进行比较并返回一个布尔值。

    【讨论】:

      【解决方案3】:

      这是因为运算符优先级。

      在第一条语句中,+ 运算符在== 之前执行,并且“str1==str2”附加到str1,之后将附加结果与== 进行比较到str2 .

      在第二个语句中,括号() 表示在顶级运算符(即+)发生之前应该评估的原子片段。这就是为什么首先将str1str2== 进行比较,然后将结果(true)作为字符串附加到"str1==str2 "

      【讨论】:

        【解决方案4】:
        System.out.println("str1==str2 "+ str1==str2);
        

        在上述行中,编译器检查是否

        "str1==str2"+str1

        即 >>> "str1==str2 str1" 是否等于 str2

        这就是为什么它打印为假

        【讨论】:

          【解决方案5】:

          应该始终使用equals 方法比较两个字符串。否则你比较它是否是相同的引用,而不是相同的值!

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2019-03-06
            • 2010-12-20
            • 2022-01-25
            • 2012-04-09
            • 2019-08-01
            • 1970-01-01
            • 2023-03-08
            • 1970-01-01
            相关资源
            最近更新 更多