这个问题其实是很多面试官喜欢问的问题,大多数童鞋都知道它们的主要区别是StringBuffer是线程安全的,StringBuilder非线程安全,因为如此,StringBuilder性能略比StringBuffer好。
我主要从它俩的源码出发来分析它们的区别。
相同点
1.它俩都继承自抽象类AbstractStringBulder,实现了Appendable, CharSequece,Serializable接口,而且都是final类型,跟String类一样不能再有子类扩展了
2.它们的内部数据结构都是字符数组:
1234 /*** The value is used for character storage.*/char[] value;3.它们默认的创建时的长度为16个字符
4.append/delete/insert/replace方法的核心操作都是通过System.arraycopy实现
5.它们都提供四个构造函数
1234 public StringBxxx();public StringBxxx(int capacity);public StringBxxx(String str);public StringBxxx(CharSequece seq);6.每当append方法执行前,都会判断数组大小是否足够,如果不够则扩展其长度,算法为 当前容量长度*2+2
12345678910111213141516171819202122232425 /*** This method has the same contract as ensureCapacity, but is* never synchronized.*/private void ensureCapacityInternal(int minimumCapacity) {// overflow-conscious codeif (minimumCapacity - value.length > 0)expandCapacity(minimumCapacity);}/*** This implements the expansion semantics of ensureCapacity with no* size check or synchronization.*/void expandCapacity(int minimumCapacity) {int newCapacity = value.length * 2 + 2;if (newCapacity - minimumCapacity < 0)newCapacity = minimumCapacity;if (newCapacity < 0) {if (minimumCapacity < 0) // overflowthrow new OutOfMemoryError();newCapacity = Integer.MAX_VALUE;}value = Arrays.copyOf(value, newCapacity);}
不同点
1.StringBuffer中方法都是synchronized的,保证线程安全
2.StringBuffer多一个toStringCache对象,当StringBuffer有toString方法执行时,就会缓存在这里,当内部数据发生变化就会清除缓存内容
3.StringBuilder从JDK1.5才开始有,而StringBuffer从JDK1.0就开始有了