<p>Java中字符串连接符“+”是重载运算符,既可算术相加又可拼接字符串;优先级决定执行顺序(低于* / %,高于=和关系运算符),类型上下文决定每次+的具体语义。</p>

Java 中字符串连接运算符(+)不是独立的“字符串专用”操作符,而是重载的二元运算符——它既可做加法,也可做字符串拼接。混用时,**优先级和结合性决定执行顺序,而类型上下文决定每次 + 是算术相加还是字符串拼接**。关键不在“能不能混”,而在“怎么混才符合预期”。
运算符优先级决定谁先算
+ 的优先级低于乘除(*、/、%),但高于赋值(=)和关系运算符(、<code>==等)。这意味着:
-
"A" + 2 * 3→ 先算2 * 3 = 6,再拼接 →"A6" -
1 + 2 + "B"→ 从左到右结合:(1 + 2) + "B"→3 + "B"→"3B" -
"A" + 1 + 2→ 同样左结合:("A" + 1) + 2→"A1" + 2→"A12" -
1 + 2 + "B" + 3 + 4→ 前两个数先加得3,之后全部转为字符串拼接 →"3B34"
类型转换规则决定拼接起点
一旦表达式中**出现第一个 String 类型的操作数**,其右侧所有 + 都按字符串拼接处理(即使后面是数字、布尔或 null):
-
1 + 2 + "x" + 3 + true→"3x3true"(1+2是算术,遇到"x"后全转拼接) -
"x" + 1 + 2→"x12"(开头就是 String,全程拼接) -
null + "a"→"nulla"(null被自动转成字符串"null") -
1 + null→ 编译报错(null无法参与算术,且左侧无 String 触发拼接)
括号强制改变逻辑顺序
当需要控制拼接与计算的边界,必须用括号明确分组:
立即学习“Java免费学习笔记(深入)”;
- 想得到
"Result: 5":写"Result: " + (2 + 3)(括号确保先算加法) - 错误写法
"Result: " + 2 + 3→ 得到"Result: 23" - 想拼接多个字段并加空格:
name + " (" + (age + 5) + ")"(括号避免age + 5被当成字符串拼接)
混用时的实用建议
- 简单表达式(如日志输出)可放心混用:
"User " + id + " logged in at " + new Date() - 涉及复杂计算时,先算好再拼:
int total = price * qty - discount;然后"Total: $" + total - 避免在循环内混用
+=拼接(性能差),改用StringBuilder - 若逻辑易歧义,宁可多写一行临时变量,也别靠记忆优先级——可读性优先


















