stringbuilder 的 append 方法支持链式调用,是因为每次调用都返回 this(当前对象本身),所有重载方法均返回 stringbuilder 类型且末尾 return this,内部在原 char[] 数组上修改、不创建新对象,符合 fluent interface 设计。

StringBuilder 的 append 方法支持链式调用,是因为它**每次调用都返回 this(当前对象本身)**,而不是 void 或新对象。
append 方法返回 this
查看 StringBuilder 源码(如 OpenJDK)可知,所有重载的 append() 方法(如 append(String)、append(int)、append(char) 等)返回类型都是 StringBuilder,且末尾统一返回 this:
- 这使得连续调用成为可能,比如:
sb.append("a").append(1).append('c') - 与 String 的不可变操作不同,StringBuilder 是可变的,所有 append 都在原对象内部字符数组上修改,不创建新对象
- 返回 this 是典型的“流式 API”设计,属于 Fluent Interface 模式
和 StringBuffer 的区别仅在线程安全
StringBuffer 的 append 方法同样返回 this,也支持链式调用。二者链式原理完全一致,差异只在于:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- StringBuilder:非线程安全,性能更高,推荐单线程场景使用
- StringBuffer:方法加了 synchronized,适合多线程环境,但链式调用机制不变
不是靠返回新对象实现的
容易误解的是“链式调用 = 返回新对象”,但 StringBuilder 并非如此:
- 它不会像 String.concat() 那样生成新字符串对象
- 内部 char[] 数组会动态扩容(如超出容量则 new char[old * 2 + 2]),但始终在原实例上操作
- 你可以用
==验证:多次 append 后引用未变,仍是同一个对象
链式调用不影响语义和性能
写成链式或分步调用,效果和性能完全等价:
-
sb.append("x").append("y").append("z")≡sb.append("x"); sb.append("y"); sb.append("z"); - 字节码层面,链式只是多几次 aload_1(加载 this 引用),无额外开销
- 可读性提升明显,尤其构造复杂字符串时(如 JSON 片段、SQL 拼接)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










