String literal1 = "java";
String object = new String("java");
String literal2 = "java";
System.out.println("result 1 = " + (literal1 == object) );
System.out.println("result 2 = " + literal1.equals(object));
System.out.println("result 3 = " + literal1 == object);
System.out.println("result 4 = " + literal1.equals(object));
System.out.println("result 5 = " + literal1 == literal2);
System.out.println("result 6 = " + literal1.equals(literal2));
预期产量
result 1 = false
result 2 = true
result 3 = false
result 4 = true
result 5 = false
result 6 = true
获得的输出
result 1 = false
result 2 = true
false
result 4 = true
false
result 6 = true
此行时
System.out.println(“结果5 =” +文字1 ==文字2);
已更改为
System.out.println(“结果5 =” +(literal1 == literal2));
输出
result 5 = true
谁能解释为什么会这样吗?
答案 0 :(得分:4)
之所以会这样,是因为表达式是从左到右求值的,因此它将首先连接您的字符串(即"result 3 = " + literal1
),然后检查真实性(即== object
),由于连接的结果与false
的值不同,因此仅打印object
。
在第一个(也是最后一个)示例("result 1 = " + (literal1 == object)
)中,您使用括号将(literal == object)
引导到默认评估中,强制false
在合并之前 进行单独评估,这就是打印{的原因{1}}仅用于该评估,并与它前面的字符串连接。
答案 1 :(得分:1)
System.out.println(“结果3 =” + literal1 == object);
System.out.println(“结果5 =” +文字1 ==文字2);
等同于
System.out.println((“结果3 =” + literal1)== object);
System.out.println((“结果5 =” + literal1)== literal2);
这是字符串串联
您可以尝试以下方法:
System.out.println(1 + 2 +“ 3”);
输出:
33
1 + 2 = 3
3 +“ 3” =“ 33”
和
System.out.println(“ 1” + 2 + 3);
输出:
123
“ 1” + 2 =“ 12”
“ 12” + 3 =“ 123
答案 2 :(得分:1)
TLDR:它是优先级,不是从左到右
Java确实有一个规则,即操作数是从左到右求值的,但这在这里没有效果。
在Java中,除赋值外,所有二进制(表示二操作数,不是按位运算符)运算符都是左关联的,但这在这里不适用,因为关联性仅在运算符具有相同优先级时才重要。
这里重要的是,+
的{{3}}比==
高,如VietDD所说
System.out.println("result 5 = " + literal1 == literal2);
# is equivalent to
System.out.println(("result 5 = " + literal1) == literal2);
# which is false because they aren't the same object
恰好与左侧分组相同。
但是如果我们考虑代替
System.out.println(literal1 == literal2 + " is result 5!");
# THAT is equivalent to
System.out.println(literal1 == (literal2 + " is result 5!"));
# ditto
恰好与分组到右侧的相同。