实际上,StringBuffer 的效率并不低,只是在某些场景下看起来比 StringBuilder 慢。常见说法是“StringBuffer 效率低”,主要原因在于线程安全带来的额外开销。
下面分点说明:
StringBuffer 的大部分方法都使用了 synchronized 修饰,例如:
public synchronized StringBuffer append(String str) {
...
}
代价:
而 StringBuilder 没有 synchronized,所以在单线程下更快。
在 99% 的实际业务代码中(如方法内部拼接字符串):
StringBuilder sb = new StringBuilder();
sb.append("a").append("b");
这里:
StringBuilder 少了锁开销 → 更快所以 “StringBuffer 效率低”通常是相对于 StringBuilder 而言的。
很多人误以为 StringBuffer 慢,其实:
String s = "a" + "b" + "c";
在编译后可能等价于:
String s = new StringBuilder().append("a").append("b").append("c").toString();
而如果是循环中拼接 String:
String s = "";
for (...) {
s += x; // 每次都新建 String 对象,非常慢
}
这时 StringBuffer / StringBuilder 明显更快。
可能的慢点包括:
例如:
new StringBuffer().append(...) // 默认容量 16,容易扩容
StringBuffer 不是效率低,而是“为了保证线程安全付出了性能代价”。
使用建议:
StringBuilder(更快)StringBuffer如果你愿意,我也可以从 JVM 实现 / 字节码层面 或 性能对比实验 来进一步说明。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。