stringbuilder与stringbuffer不能直接转换,需通过string中转:stringbuffer→stringbuilder用tostring()再构造;反之亦然;因二者无继承关系且线程安全机制不同,强制转换会失败。

Java中StringBuilder与StringBuffer本身不能直接相互转换,因为它们是两个独立的类,没有继承或实现彼此的关系。但可以通过String作为中间桥梁完成内容迁移,核心在于“内容复制”,而非类型强转。
StringBuffer → StringBuilder
先把StringBuffer转成String,再用该String构造StringBuilder:
- 调用StringBuffer.toString()获取当前内容的不可变副本
- 将该String传入new StringBuilder(String)构造器
示例代码:
StringBuffer sbf = new StringBuffer("hello");
StringBuilder sbd = new StringBuilder(sbf.toString());
StringBuilder → StringBuffer
同理,先转String,再构造StringBuffer:
- 调用StringBuilder.toString()
- 传入new StringBuffer(String)构造器
示例代码:
StringBuilder sbd = new StringBuilder("world");
StringBuffer sbf = new StringBuffer(sbd.toString());
为什么不能直接强制转换?
StringBuffer和StringBuilder都继承自AbstractStringBuilder,但二者互不兼容:
- 它们不是父子类,也没有共同接口定义转换契约
- 强制类型转换(如(StringBuffer)sbd)会编译失败或抛ClassCastException
- 线程安全差异(synchronized vs 非同步)决定了设计上必须隔离实例行为
实际开发中的建议
除非业务逻辑明确要求切换线程安全模型,否则不建议频繁互转:
- 单线程场景优先用StringBuilder,避免无谓的synchronized开销
- 多线程共享拼接对象时,直接用StringBuffer,无需中途转出
- 若需统一处理逻辑,可面向CharSequence接口编程(两者都实现该接口)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











