Java' +'算术运算符之间的运算符字符串连接?

时间:2016-07-13 13:13:07

标签: java string concatenation add

我们知道 Java' +'

用于运算符
  • 算术添加
  • 字符串连接

当我一起使用时,需要知道完全预期的行为和应用规则 当我尝试遵循java代码

System.out.println("3" + 3 + 3);    // print 333    String concatenation ONLY
System.out.println(3 + "3" + 3);    // print 333    String concatenation OLNY
System.out.println(3 + 3 + "3");    // print 63     Arithmetic Add & String concatenation

3 个答案:

答案 0 :(得分:12)

这是基本的运算符优先级,与String级联和数字加法相结合。

引用:

  

如果只有一个操作数表达式是String类型,则为string   转换(第5.1.11节)在另一个操作数上执行以产生a   运行时的字符串。

     

字符串连接的结果是对String对象的引用   这是两个操作数字符串的串联。那些角色   左手操作数的前面是右手的字符   新创建的字符串中的操作数。

     

除非表达式是a,否则新创建String对象(第12.5节)   常数表达式(§15.28)。

     

实现可以选择执行转换和连接   在一步中避免创建然后丢弃中间体   字符串对象。增加重复字符串的性能   连接,Java编译器可以使用StringBuffer类或a   类似的技术减少了中间String对象的数量   通过评估表达式创建的。

     

对于原始类型,实现也可以优化掉   通过直接从基元转换来创建包装器对象   键入字符串。

请参阅语言规范here

<强> TL; DR

  • +的运算符优先级是从左到右
  • 如果二进制操作中的任何操作数是String,则结果为String
  • 如果两个操作数均为数字,则结果为数字

答案 1 :(得分:5)

这与字符串连接本身无关。它是关于String的隐式转换。它从左到右操作,在上面的例子中没有隐含的括号。并且String优先于int。

示例1

System.out.println("3" + 3 + 3);

这里,它以字符串开头,因此在执行+运算符之前,每个操作都会隐式转换为字符串。因此,“333”。

示例2

System.out.println(3 + "3" + 3);

同样适用于此,因为String优先于最初的3。

示例3

System.out.println(3 + 3 + "3");

在这种情况下,前两个数字被添加,因为它们是整数,结果是6,但是当它被添加到下一个字符串时,它会假定连接,因此“63”。

根据specification

答案 2 :(得分:4)

+的评估优先顺序是从左到右,这就是它的工作原理:

  1. System.out.println("3" + 3 + 3);
    当你尝试这个时,由于第一个参数是String,所以其余部分都是字符串连接

  2. System.out.println(3 + "3" + 3);

    同样适用于此,因为您无法将int 3添加到String 3,然后将3连接到第二个3

  3. System.out.println(3 + 3 + "3");

    评估从左到右的表达式(给出3 + 3 = 6)然后将字符串3附加到评估结果中,将63作为输出