+ 运算符在 Java 中有两种含义。
- 当两个操作数都是数字时1,表示算术加法。
- 当任一操作数的类型为
String 时,表示字符串连接。
在字符串连接的情况下,非字符串参数首先是字符串。该过程称为字符串转换,在JLS 5.11.1 中指定。程序如下:
- 原始类型被转换为字符串就好像它被装箱了,并且在装箱的值上调用了
toString()。
-
null 被转换为字符串"null"。
- 任何其他引用类型都通过调用其
toString() 进行转换。
+ 连接的完整语义在JLS 15.8.1 中指定。
@Baby's answer 解释了问题中第一个示例的工作原理,第二个示例类似。 (请注意,* 的优先级高于+,因此2 * 4 被评估为乘法,然后8 用于串联。)
第三个示例是将数字转换为String 的常见Java 习惯用法。因此
1 + "" -> "1" // equivalent to Integer.toString(1)
1.0 + "" -> "1.0" // equivalent to Double.toString(1.0)
从表面上看,cmets 中的版本应该更有效率。与"" 连接似乎会执行不必要的连接。但是,如果您仔细阅读规范的措辞,很明显,Java 编译器允许将第一种形式优化为第二种形式。据我了解,它们在最近的 Java 版本中是这样的。
许多人认为... + "" 成语是不好的做法。但是,它很常见,您需要在遇到它时识别它。
1 - 在这种情况下,这意味着任何整数或浮点基本类型,或任何匹配的包装器类型。全套为byte,short,char,int,long,float,double,java.lang.Byte,java.lang.Short,@9876545349@,@988 @、java.lang.Float 和 java.lang.Double。