System.out.println 同时使用 String 和 int 时的行为

System.out.println behavior when using String and int together

考虑以下代码片段 -

public class Student {

    public static void main(String args[]) {
        int a = 3;
        int b = 4;
        System.out.println(a + b +" ");
        System.out.println(a + b +" "+ a+b);
        System.out.println(""+ a+b);

    }
}

上述代码片段的输出为 -

7
7 34
34

从输出中可以清楚地看出,如果我们首先在 print 语句中使用 String,那么整数将被连接起来。但是,如果我们首先使用整数,然后添加并显示值。

有人可以解释为什么会出现这种行为吗?

我什至试图查看 PrintStream 中 println() 方法的实现 class 但无法弄清楚。

实际上,造成这种情况的不是 println() 实现,这是 Java 在处理 Strings 时处理 + 运算符的方法。

实际上操作是从左到右处理的,所以:

  • 如果 string 在操作 int(或任何其他类型)之前出现,则使用 String conversion 并且所有其余操作数将被视为 strings,并且它只包含一个String级联操作
  • 如果int在操作中先出现,它将被视为int因此使用addition操作

这就是为什么a + b +" "给出7的原因,因为String在运算的末尾,而对于其他表达式a + b +" "+ a+b""+ a+b,变量ab 如果在表达式中出现在 String 之后,将被视为 strings

有关详细信息,您可以查看 String Concatenation Operator + in Java Specs

第一种情况:

System.out.println(a + b +" ");

在这个顺序中,a + b首先被计算为一个整数和,然后在添加space时转换为一个字符串(这里的第二个+用于字符串连接) .

第二种情况:

System.out.println(a + b +" "+ a+b);

这里第一部分是int sum运算,然后转换为字符串,因为我们添加了space(第二个+用于字符串连接),其余部分将是字符串连接作为左操作数已经是一个字符串。

第三种情况:

System.out.println(""+ a+b);

与第二个相同。

备注:

为了改变这种行为,只需在 string 连接之前添加括号以强制 int 总和。

println的实现无关。在执行 println 之前评估传递给 println 的表达式的值。

它是从左到右计算的。只要 + 的两个操作数都是数字,就会执行加法。一旦至少一个操作数是 String,将执行 String 连接。

System.out.println(a    +      b          +       " ");
                  // int + int      int + String
                  // addition,      concatenation 
System.out.println(a    +      b    +    " "   +    a   +    b);
                  // int + int  int + String Str+Str  Str+Str
                  // addition,    concat,    concat,  concat
System.out.println(""   +     a     +      b);
                  // String+int  String+int
                  // concat,      concat