算术添加和字符串连接之间的Java’+’运算符?
据我们所知
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
这是基本的运算符优先级,与String
连接和数字加法相结合。
引用:
如果只有一个操作数表达式是String类型,则对另一个操作数执行字符串转换(第5.1.11节)以在运行时生成字符串。
字符串连接的结果是对String对象的引用,该对象是两个操作数字符串的串联。 左侧操作数的字符位于新创建的字符串中右侧操作数的字符之前。
除非表达式是常量表达式(第15.28节),否则新创建String对象(第12.5节)。
实现可以选择在一个步骤中执行转换和连接,以避免创建然后丢弃中间String对象。 为了提高重复字符串连接的性能,Java编译器可以使用StringBuffer类或类似技术来减少通过表达式求值创建的中间String对象的数量。
对于基本类型,实现还可以通过直接从基元类型转换为字符串来优化包装器对象的创建。
请参阅此处的语言规范
TL; DR
-
+
运算符优先级从左到右 - 如果二进制操作中的任何操作数是
String
,则结果为String
- 如果两个操作数都是数字,则结果为数字
+
的评估优先级是从左到右,这是它的工作原理:
-
System.out.println("3" + 3 + 3);
当你尝试这个时,因为第一个参数是一个String
,所以其余的都是一个字符串连接 -
System.out.println(3 + "3" + 3);
同样适用于此,因为您不能将第一个
int 3
添加到String 3
,然后将最后3
连接到第二个3
-
System.out.println(3 + 3 + "3");
评估第一个从左到右的表达式(给出3 + 3 = 6)然后将字符串
3
附加到该评估的结果,给出63
作为输出
这与字符串连接本身无关。 它是关于隐式转换为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");
在这种情况下,前两个数字是以整数forms添加的,结果是6,但是当它被添加到下一个字符串时,它会假定连接,因此为“63”。
按照规范 。