a = a + b 与 a += b 的区别?
在Java中,a = a + b 和 a += b 的区别主要体现在类型转换和操作符行为上,具体如下:
1. 基本数据类型(如 int, byte, short, char)
-
a += b- 隐式类型转换:复合赋值运算符
+=会自动将右侧表达式的结果转换为左侧变量的类型。 - 示例:
byte a = 10; byte b = 20; a += b; // 合法:自动将 int 类型的 30 转换为 byte
- 隐式类型转换:复合赋值运算符
-
a = a + b- 显式类型转换:
a + b的结果是int类型,直接赋值给byte/short/char类型的变量会编译错误,需强制转换。 - 示例:
byte a = 10; byte b = 20; a = a + b; // 编译错误:需要强制转换 (byte)(a + b)
- 显式类型转换:
2. 引用类型(如 String)
a += b与a = a + b- 行为一致:两者均会生成新对象(
String不可变),但编译器可能对+=进行优化(如使用StringBuilder)。 - 示例:
String a = "Hello"; String b = "World"; a += b; // 等价于 a = new StringBuilder(a).append(b).toString(); a = a + b; // 生成新对象,逻辑相同
- 行为一致:两者均会生成新对象(
3. 自定义对象
- 无运算符重载:Java不支持运算符重载(除
String外),因此+=和+无法直接用于自定义对象。 - 需手动实现:若需类似行为,需显式调用方法(如
append)。
总结
| 场景 | a += b 行为 |
a = a + b 行为 |
|---|---|---|
| 基本类型(小范围) | 自动类型转换(避免编译错误) | 需显式强制转换(否则编译错误) |
| 基本类型(大范围) | 行为相同(如 int, long) |
行为相同 |
String |
生成新对象(可能优化) | 生成新对象 |
| 自定义对象 | 不适用(需手动实现) | 不适用 |
关键区别
- 类型安全:对
byte/short/char,+=避免显式转换,更简洁安全。 - 性能:
String拼接时,+=可能被编译器优化(如StringBuilder),但结果一致。 - 适用性:
+=仅适用于数值类型和String,自定义对象需显式方法调用。
本文是原创文章,采用 CC BY-NC-ND 4.0 协议,完整转载请注明来自 程序员小航
评论
匿名评论
隐私政策
你无需删除空行,直接评论以获取最佳展示效果