还不知道StringBuffer和StringBuild的区别?别找了看完这个就清楚了!

StringBuffer和StringBuilder的区别?

在回答这个问题之前,我们需要先知道为什么String是不可变的?其实非常简单,看一下String的源码我们就清楚了
还不知道StringBuffer和StringBuild的区别?别找了看完这个就清楚了!_第1张图片
不难发现,String类中使用了final关键字修饰字符数组来保存字符,所以不可变。
在探讨StringBuffer和StringBuilder的区别之前,我们先来看看两者有什么相同的地方:这里建议大家看完文章后,也打开IDE阅读下相关的源码,点进去看一看,这样印象会很深。
还不知道StringBuffer和StringBuild的区别?别找了看完这个就清楚了!_第2张图片
还不知道StringBuffer和StringBuild的区别?别找了看完这个就清楚了!_第3张图片
还不知道StringBuffer和StringBuild的区别?别找了看完这个就清楚了!_第4张图片
两者共性:

  • 他们都继承了AbstractStringBuilder类,并且再SbstractStringBuilder类中,用于字符存储的方法char[ ] value没有被final关键字修饰,所以这两者都是可变的。
  • StringBuffer和StringBuilder的构造方法都是调用父类的构造方法实现的。

线程安全性:
StringBuffer对方

  • 法和调用的方法都加了同步锁,所以线程是安全的,而Stringbuilder则没有加锁,因而线程不安全
    还不知道StringBuffer和StringBuild的区别?别找了看完这个就清楚了!_第5张图片
    还不知道StringBuffer和StringBuild的区别?别找了看完这个就清楚了!_第6张图片
    性能
  • 每次对String类型进行改变的时候,都会生成一个新的String对象,然后将指针指向新的对象。(这也是为什么String类不可变但是可以对其进行操作的原因)StringBuffer 每次都会对 StringBuffer 对象本身进行操作,而不是生成新的对象并改变对象引用。相同情况下使用 StringBuilder 相比使用 StringBuffer 仅能获得 10%~15% 左右的性能提升,但却要冒多线程不安全的风险。

总结

  • 操作少量数据使用String
  • 单线程操作字符串数据使用StringBuilder
  • 多线程操作字符串数据使用StringBuffer

你可能感兴趣的:(Java基础)