我们知道 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
答案 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”。
答案 2 :(得分:4)
+
的评估优先顺序是从左到右,这就是它的工作原理:
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
作为输出