stringbuilder通过自动调用对象tostring()实现非字符串拼接,对基本类型有专用重载方法提升性能,null值转为"null"字符串,避免高开销tostring()直接调用。

StringBuilder 本身只接受字符串类型参数,但能自动调用非字符串对象的 toString() 方法完成转换,这是它实现“快速拼接非字符串对象”的核心机制。
自动调用 toString() 是默认行为
当你把任意对象(如 Integer、Date、自定义类实例)传给 append() 方法时,StringBuilder 不会报错,而是直接调用该对象的 toString()。这个过程由 Java 编译器在编译期插入,无需手动转换。
-
sb.append(123)等价于sb.append(Integer.toString(123)) -
sb.append(new Date())实际调用new Date().toString() - 若自定义类未重写
toString(),则使用父类Object.toString()(输出类似MyClass@1a2b3c)
避免隐式装箱与重复 toString() 调用
对基本类型(int、long、boolean 等),StringBuilder 提供了专用重载方法(如 append(int)),绕过包装类和 toString(),性能更高。
- 推荐写法:
sb.append(42)(直接处理 int) - 不推荐:
sb.append(Integer.valueOf(42))或sb.append("" + 42),会触发多余对象创建或字符串连接 - 对 null 值,
append(null)会写入字符串 "null",不是空指针异常
批量拼接多个对象的小技巧
连续多次 append() 比先转成字符串再拼接更高效,因为避免了中间字符串对象的创建。
- 好:
sb.append(name).append("-").append(age).append("@").append(city) - 差:
sb.append(name + "-" + age + "@" + city)——触发多次 StringBuilder 创建和toString() - 若对象可能为 null,可提前判断或封装工具方法,避免输出意外的 "null"
注意 toString() 的开销不可忽略
某些对象的 toString() 实现较重(如包含递归遍历、格式化、IO 等),会拖慢拼接速度。
- 例如:大型集合、JSON 序列化对象、日志上下文等,其
toString()可能很耗时 - 建议预计算:
String desc = obj.toString(); sb.append(desc);,便于复用或加缓存 - 调试时可临时重写
toString()返回简短标识,提升日志拼接效率
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











