当前位置: 首页 > 科技观察

StringBuffer和StringBuilder的3个区别

时间:2023-03-11 22:23:17 科技观察

StringBuffer和StringBuilder是可变字符串,但是它们的区别是Java初中级面试中出现概率非常高的一道题。这么简单的一个问题,但是在面试过程中,很多求职者经常抱怨自己对使用场景一头雾水。今天就带大家彻底了解StringBuffer和StringBuilder的区别和应用场景。如果您是高手,请跳过。如果你是菜鸟,或者对这两个不是很清楚,可以学习一下,或者年底面试的Sprint。我们看一下StringBuffer和StringBuilder的类结构:其实很简单,就是继承了一个抽象的字符串父类:AbstractStringBuilder。让我们来看看它们之间的三个区别。区别一:Thread-safeStringBuffer:线程安全,StringBuilder:线程不安全。因为StringBuffer的所有public方法都是synchronized的,StringBuilder没有用StringBuilder修饰。StringBuffer代码片段:@OverridepublicsynchronizedStringBufferappend(Stringstr){toStringCache=null;super.append(str);returnthis;}区别二:BufferStringBuffer代码片段:privatetransientchar[]toStringCache;@OverridepublicsynchronizedStringtoString(){if(toStringCache==null){toStringCache=Arrays.copyOfRange(value,0,count);}returnnewString(toStringCache,true);}StringBuilder代码片段:@OverridepublicStringtoString(){//Createacopy,don'tsharethearrayreturnnewString(value,0,count);}可以看到注意,StringBuffer每次获取到toString时,都会直接使用buffer中的toStringCache值来构造字符串。而StringBuilder每次都需要复制一次字符数组,然后构造一个字符串。所以缓存刷新也是对StringBuffer的一种优化,但是StringBuffer的toString方法还是同步的。区别三:性能由于StringBuffer是线程安全的,它所有的public方法都是同步的,而StringBuilder不锁同步方法,所以毫无疑问StringBuilder的性能要比StringBuffer大很多。综上所述,StringBuffer适合对同一个StringBuffer进行多线程操作,而StringBuilder更适合单线程应用。