我们都只到String和StringBuffer的区别,即String是不可拓展的,即String如果要实现A字符串+B字符串的效果,则不能直接把B接在A后面,而必须新开一个C,然后把A+B放进C.而StringBuffer是可拓展的,如果A是StringBuffer要实现A+B的效果只要把B放进A后面就行了(append())。那么为什么他们有这样的区别呢,还是来看看源码就知道了。
//String
public final class String
{
private final char value[]; //注意这个final
public String(String original) {
// 把原字符串original切分成字符数组并赋给value[];
}
}
//StringBuffer
public final class StringBuffer extends AbstractStringBuilder
{
char value[]; //继承了父类AbstractStringBuilder中的value[]
public StringBuffer(String str) {
super(str.length() + 16); //继承父类的构造器,并创建一个大小为str.length()+16的value[]数组
append(str); //将str切分成字符序列并加入到value[]中
}
}
可以看出
String和StringBuffer中的value[]都用于存储字符序列。
但是,String中的是常量(final)数组,只能被赋值一次。而StringBuffer中的value[]就是一个很普通的数组,而且可以通过append()方法将新字符串加入value[]末尾。这样也就改变了value[]的内容和大小了。
接下来看看StringBuffer和StringBulider(JDK1.5之后才有的),其实这两者没有什么本质的区别,只不过,StringBuffer是线程安全的,而StringBulider是非线程安全的,当然StringBuilder的效率肯定会更高,但是StringBuffer可以允许多线程操作。所以根据实际情况来选择使用二者中的哪一个。