我们需要StringBuffer么?

原创
2013/05/09 12:25
阅读数 133

这些天的工作中,一直在不停的拼字符串,所以较多的使用了StringBuffer这个类,昨天没事看了看自己的代码,突然想到面试时经常被问到的StringBuffer和StringBuilder的区别,脑子里只是有个大概的印象,一个是线程安全的,一个是线程不安全的。

当然我也随手点进去看了看StringBuffer的源代码,随便看了两个常用的方法:append和toString。他们都在方法上做了同步:

public synchronized String toString() {
return new String(value, 0, count);
 }

我立马意识到自己使用StringBuffer是多么大的一个失误,因为我使用StringBuffer的场景都是把他用作局部变量,根本不会有线程安全的问题,所以我立马将代码中所有的StringBuffer替换为StringBuilder。改完了,回来再仔细想想,StringBuffer这个类还有必要存在么?我觉得我们完全可以忽略他的存在,直接使用StringBuilder,原因如下:

1.我们使用StringBuffer的大多数场景都是线程安全的。

2.即使我们把StringBuffer当共享变量,StringBuffer本身提供的同步还是远远不能保证线程安全,比如我们经常会这么写:

StringBuffer sb = new StringBuffer();
public void addRule(String name) {
          sb.append(name).append("\n");
}

即使 StringBuffer保证了append的安全性,但是上面的例子还是线程不安全的。

所以在大多数情况下,StringBuffer的线程安全是完全没有意义的,我们完全可以用StringBuilder替换。那为什么JDK的源代码中还是有较多的地方使用StringBuffer了?我们可以看看这篇文章

展开阅读全文
打赏
0
0 收藏
分享
加载中
更多评论
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部