【问题标题】:Java '+' operator between Arithmetic Add & String concatenation? [duplicate]算术加法和字符串连接之间的Java'+'运算符? [复制]
【发布时间】:2025-12-19 04:05:07
【问题描述】:

众所周知
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

【问题讨论】:

  • 操作数从左到右计算。预期的行为是您在运行此程序时看到的行为。
  • 另外值得一提的是,您可以在输入字符串后添加数字,例如:System.out.println("3" + (3 + 3)); 将打印 36。如果您隔离数字,您将实际计算它们,而不仅仅是打印它们.

标签: java string concatenation add


【解决方案1】:

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

引用:

如果只有一个操作数表达式是字符串类型,那么字符串 对另一个操作数执行转换(§5.1.11)以产生一个 运行时的字符串。

字符串连接的结果是一个String对象的引用 那是两个操作数字符串的连接。那些角色 左边的操作数在右边的字符之前 新创建的字符串中的操作数。

String 对象是新创建的(第 12.5 节),除非表达式是 常量表达式(第 15.28 节)。

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

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

请参阅语言规范here

TL;DR

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

【讨论】:

    【解决方案2】:

    这与字符串连接本身无关。它是关于隐式转换为字符串的。它从左到右运行,在上述情况下没有隐式括号。并且 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

    【讨论】:

      【解决方案3】:

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

      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 作为输出

      【讨论】: