刚刚在参加网易实习生在线考试的时候,出了一道选择题谈到了StringBuilder这个类的一些选项,虽然那道题自己做对了,但是也提醒了我应该好好了解一些StringBuffer与StringBuilder。
先来看看这两个类的类结构图:
从类的结构图,我们可以看到:
1)StringBuffer与StringBuilder都实现了相同接口CharSequence,Serializable及继承自相同的类AbstractStringBuilder。
2)既然它们都继承自AbstractStringBuilder,而这个抽象类提供了StringBuffer和StringBuilder绝大部分的实现。因此StingBuffer与StringBuilder在功能上完全相同,唯一不同是它们在不同情况下的运行效率不同,具体说是在多线程与单线程下的效率不同。因为StringBuffer所有方法(构造方法除外)签名中都使用 synchronized 限定,也就是所有的方法都是同步的 。这我们可以通过查看它们的源码,如下:
StringBuffer中的replace()方法
public synchronized StringBuffer replace(int start, int end, String str) { super.replace(start, end, str); return this; }
StirngBuilder中的replace()方法:
public StringBuilder replace(int start, int end, String str) { super.replace(start, end, str); return this; }
其实java中的这种情况在集合中也存在,如:HashTable是线程安全的,很多方法都是synchronized方法,而HashMap不是线程安全的,但其在单线程程序中的性能比HashTable要高,,区别在于StringBuffer线性安全的,适合多线程中使用。StringBuilder线性不安全的,不适合多线程中使用。新引入的StringBuilder类不是线程安全的,但其在单线程中的性能比StringBuffer高,这是因为StringBuffer为了达到线程安全的目的在一定程度上会降低程序的性能。
3)它们都可以通过append()方法来动态的添加它们的长度。