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)

它是字符串连接

  • 表达式从左到右求值
  • 如果任一操作数是字符串,+表示串联
  • 您可以尝试以下方法:

    系统输出打印Ln(1+2+“3”)

    输出:

    三十三

    1+2=3

    3+“3”=“33”

    系统输出打印项次(“1”+2+3)

    输出:

    123

    “1”+2=“12”


    “12”+3=“123

    TLDR:它是优先顺序,而不是从左到右

    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“表达式从左到右求值”。误导性:操作数从左到右求值,但运算符根据其优先级和关联性求值。