还不知道StringBuffer和StringBuild的区别?别找了看完这个就清楚了!
StringBuffer和StringBuilder的区别?
在回答这个问题之前,我们需要先知道为什么String是不可变的?其实非常简单,看一下String的源码我们就清楚了
不难发现,String类中使用了final
关键字修饰字符数组来保存字符,所以不可变。
在探讨StringBuffer和StringBuilder的区别之前,我们先来看看两者有什么相同的地方:这里建议大家看完文章后,也打开IDE阅读下相关的源码,点进去看一看,这样印象会很深。
两者共性:
- 他们都继承了
AbstractStringBuilder
类,并且再SbstractStringBuilder类中,用于字符存储的方法char[ ] value
没有被final关键字修饰,所以这两者都是可变的。 - StringBuffer和StringBuilder的构造方法都是调用父类的构造方法实现的。
线程安全性:
StringBuffer对方
- 法和调用的方法都加了同步锁,所以线程是安全的,而Stringbuilder则没有加锁,因而线程不安全
性能 - 每次对String类型进行改变的时候,都会生成一个新的String对象,然后将指针指向新的对象。(这也是为什么String类不可变但是可以对其进行操作的原因)StringBuffer 每次都会对 StringBuffer 对象本身进行操作,而不是生成新的对象并改变对象引用。相同情况下使用 StringBuilder 相比使用 StringBuffer 仅能获得 10%~15% 左右的性能提升,但却要冒多线程不安全的风险。
总结
- 操作少量数据使用String
- 单线程操作字符串数据使用StringBuilder
- 多线程操作字符串数据使用StringBuffer