Java println()中==的函数
预期产出Java println()中==的函数,java,equals,println,Java,Equals,Println,预期产出 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 = "
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
false
result 4 = true
false
result 6 = true
获得的输出
result 1 = false
result 2 = true
result 3 = false
result 4 = true
result 5 = false
result 6 = true
当这条线
System.out.println(“结果5=“+literal1==literal2”)强>
改为
System.out.println(“结果5=“+(literal1==literal2))强>
输出
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
false
result 4 = true
false
result 6 = true
有人能解释一下为什么会发生这种情况吗?之所以会发生这种情况,是因为表达式是从左到右求值的,所以它将首先连接字符串(即
“result 3=“+literal1
),然后检查真实性(即==object
),因此,只打印false
,因为串联的结果与对象的值不同
在第一个(也是最后一个)示例(“result 1=“+(literal1==object)
)中,您使用括号指示默认求值,强制(literal1==object)
在
串联之前单独求值,这就是它仅为该求值打印false的原因,与前面的字符串连接
System.out.println(“结果3=“+literal1==object”)
System.out.println(“结果5=“+literal1==literal2”)
相当于
System.out.println(((“结果3=“+literal1)=对象)
System.out.println(((“结果5=“+literal1)=literal2)
它是字符串连接
“12”+3=“123TLDR:它是优先顺序,而不是从左到右
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
false
result 4 = true
false
result 6 = true
Java确实有一个规则,即从左到右计算操作数,但这在这里没有效果
同样在Java中,除赋值之外的所有二进制(意味着两个操作数,而不是按位)运算符都是左关联的,但这在这里并不适用,因为只有当运算符具有相同的优先级时,关联性才起作用
这里重要的是,+
比==
高,正如VietDD所说
result 5 = true
这恰好与左边的分组相同
<>但是如果我们考虑的是
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
这恰好与右边的分组相同。Ha!对于一些“java入门”来说,这是一个很好的问题“当然。对不起,我不得不否决投票,因为第一行的声明明显虚假<代码>+在
==
之前求值是因为运算符的优先级,而不是因为从左到右的求值顺序。@NPE:通常是,但不适用于字符串文字和字符串常量表达式;请参阅JLS 3.10.5“表达式从左到右求值”。误导性:操作数从左到右求值,但运算符根据其优先级和关联性求值。