java中“+”不是字符串连接符而是编译器重载:任一操作数为string时触发tostring()拼接,且从左到右结合;|和&是位运算符,不可用于字符串连接,否则编译报错。

Java里用+拼字符串,不是“连接符”而是重载运算符
Java没有专门的字符串连接符,+在涉及字符串时是编译器特设的重载行为:只要左右任一操作数是String类型,整个表达式就按字符串拼接处理,其他操作数会自动调用toString()(null变成字符串"null")。这不是语法层面的“连接符”,而是编译期生成StringBuilder调用的糖衣。
常见误判场景:
-
System.out.println(1 + 2 + "a");输出"3a"(先算整数加法) -
System.out.println("a" + 1 + 2);输出"a12"(从左到右,遇到字符串后全部转为拼接) -
int a = 1; System.out.println(a + null);编译不通过——null不是String,无法触发字符串重载规则
|和&根本不能用于字符串连接,它们是位运算符
|(按位或)、&(按位与)只对整数类型(int、long等)或布尔类型有效。把它们写在字符串之间,比如"a" | "b",会直接编译报错:bad operand types for binary operator '|'。
容易混淆的点:
立即学习“Java免费学习笔记(深入)”;
- 有人误以为
&像某些脚本语言里的&拼接符,但Java中&只是&的转义写法,在源码里等价于单个& -
boolean值可用|和&做逻辑运算(非短路),但跟字符串无关 - 若强行把字符串转成
char再位运算,例如(int)'a' | (int)'b',得到的是数值结果(97 | 98 = 99),不是字符串"ab"
真正需要高效拼接时,别只靠+,尤其在循环里
编译器对静态字符串+会优化成常量(如"a" + "b" → "ab"),但含变量时,每次+都会新建StringBuilder对象(Java 8+ 是这样优化的),而频繁创建仍影响性能。
实操建议:
- 单条语句拼接:用
+完全没问题,可读性好 - 循环内拼接(如构建日志、SQL):显式用
StringBuilder,避免隐式对象开销 - Java 15+ 可考虑
String.join()或String.formatted(),但注意前者只适用于已知分隔符的集合拼接 - 不要为“看起来更高级”而用
String.concat()——它内部仍是新建String,且不支持null
混淆根源:XML/HTML转义和IDE提示误导人
很多人在IDE里看到&被高亮成实体符号,或在XML配置中写&表示&,就误以为Java也支持这个写法。其实那是XML解析层的事,Java源码里&只是字符字面量,不是运算符。
另一个坑是错误的IDE提示:某些旧版插件在字符串后敲|可能弹出补全建议,但这不代表语法合法——按下回车仍会编译失败。
最稳妥的验证方式:写一行String s = "a" | "b";,看是否立刻红标并报错。只要报错,就说明它和连接无关。











