String、StringBuffer、StringBuilder 如何选择?
查看完整题解
参考回答
直接回答
String 表示不可变字符串值;StringBuilder 和 StringBuffer 都是可变字符序列。单线程连续构造文本,通常选择 StringBuilder;需要共享可变缓冲区且相应同步语义合适时,再考虑 StringBuffer。String 不可变是其 API 和实现共同维持的设计,不是只靠一个 final 引用。
讲清原理
String 不提供直接修改自身内容的方法,内部表示也不能通过普通公开 API 随意改写;很多“修改”方法返回新的字符串值。不要把某个 JDK 的内部字段布局当成永远成立的语言规则,例如现代实现并不总是 char[]。
StringBuffer 的同步主要作用于方法操作,不能自动包住调用方的“检查后再执行”。StringBuilder 没有这种同步保证。也不能不经测量就断言所有拼接场景中 StringBuilder 都比 + 快。
例子与易错点
var builder = new StringBuilder();
for (int i = 0; i < 3; i++) builder.append(i);
String result = builder.toString();
builder.append(3);
System.out.println(result); // 012
后续修改 builder 不会改变已得到的 String 值。String 适合稳定文本,可变构造器负责构造阶段,两者可以配合使用。
相关题:第 27 题、第 34 题、第 51 题。
这道题,你掌握得怎么样?
掌握程度由你主动标记,阅读和收藏不会自动改变状态。