1、String是不可变的,StringBuffer和StringBuilder是可变的
String和StringBuffer、StringBuilder内部都是使用char[]数组来存储,但它们之间内部的定义不同
查看源码可知:
String内部声明的char[]数组是 private final char value[];
StringBuffer和StringBuiler都是继承自AbstractStringBuilder,它们内部声明的char[]数组不是private final类型,为:char[] value;
2、StringBuffer是线程安全的,而StringBuiler是非线程安全的
StringBuilder在JDK1.5才开始出现,之前是没有的
StringBuffer是线程安全的是由于StringBuffer内部定义的方法前面都使用Synchronized修饰了,如下:
public synchronized int length() {
return count;
}
而所以StringBuilder的方法没有使用synchronize修饰,所以在多线程的情况下,StringBuffer能保证线程安全,而StringBuilder不能保证
3、String、StringBuffer和StringBuilder之间速度不同,StringBuilder优于StringBuffer优于String
由于String是不能改变的,所以每次对String进行修改,就会重新new一个对象,而StringBuilder和StringBuffer都可以在源对象上进行修改
当需要大量的修改时,String每次会new出很多对象出来,而且很多对象new出来之后,可能就不再使用变成内存垃圾,此时会导致频繁的
垃圾回收,最终造成运行速度变慢。
4、String声明后容量大小不能改变,StringBuffer和StringBuilder可以动态扩容
String由于内部数组声明的是final,所以大小不能再改变
而StringBuilder和StringBuffer初试化容量是16,当使用过程中容量不够后,会自动进行扩容,每次都是新申请一个原空间2倍大小空间,如果
此时容量还不够,就直接扩充到需要的大小。
public StringBuilder() {
super(16);
}
参考: http://blog.csdn.net/xieyuooo/article/details/6859160