static final long serialVersionUID = 3388685877147921107L;
/**
* 可以看出会有16B的默认空间
*/
public StringBuffer() {
super(16);
}
public final class StringBuffer
extends AbstractStringBuilder
implements java.io.Serializable, CharSequence
{
/** use serialVersionUID from JDK 1.0.2 for interoperability */
static final long serialVersionUID = 3388685877147921107L;
/**
* 可以看出会有16B的默认空间
*/
public StringBuffer() {
super(16);
}从这里可以看出,如果什么都不存放的话,StringBuffer会有16字节的默认空间
看看StringBuffer的父类,更清楚:)
[cpp] view plaincopyprint abstract class AbstractStringBuilder implements Appendable, CharSequence {
/**
*这个value就是用来存放字符串的,默认情况下就是16B的空间,没有final吧:)
*/
char value[];
abstract class AbstractStringBuilder implements Appendable, CharSequence {
/**
*这个value就是用来存放字符串的,默认情况下就是16B的空间,没有final吧:)
*/
char value[];看了这些,你也应该知道String与StringBuffer的区别,还有一点就是StringBuffer是线程安全的,体现在哪呢,看看源代码吧:)
[java]
public synchronized int length() {
return count;
}
public synchronized int capacity() {
return value.length;
}
public synchronized void ensureCapacity(int minimumCapacity) {
if (minimumCapacity > value.length) {
expandCapacity(minimumCapacity);
}
}
public synchronized int length() {
return count;
}
public synchronized int capacity() {
return value.length;
}
public synchronized void ensureCapacity(int minimumCapacity) {
if (minimumCapacity > value.length) {
expandCapacity(minimumCapacity);
}
}
上面只是部份方法,你可以看到的是大部份的方法都含有一个synchronized关键字,这个关键字的作用就是用来进行线程同步的,因此是多线程安全的。
StringBuilder的测试源代码:
[java]
//生成一个StringBuilder对象,并在里面存放abc
StringBuilder str=new StringBuilder("abc");
//tmp也指向这个StringBuffer对象
StringBuilder tmp=str;
//对字符串进行重新赋值,如果str是可以更改的,那么最终的结果就是tmp与str的值还是一样的
str=str.append("abc");
//将结果打印出来
System.out.println(str);//abcabc
System.out.println(tmp);//abcabc
//时间测试,待会与后面结果对比
long start=System.currentTimeMillis();
for(int i=0;i<1000000;i++)
str=str.append("a");
//平均时间在36左右
System.out.println(System.currentTimeMillis()-start);
//生成一个StringBuilder对象,并在里面存放abc
StringBuilder str=new StringBuilder("abc");
//tmp也指向这个StringBuffer对象
StringBuilder tmp=str;
//对字符串进行重新赋值,如果str是可以更改的,那么最终的结果就是tmp与str的值还是一样的
str=str.append("abc");
//将结果打印出来
System.out.println(str);//abcabc
System.out.println(tmp);//abcabc
//时间测试,待会与后面结果对比
long start=System.currentTimeMillis();
for(int i=0;i<1000000;i++)
str=str.append("a");
//平均时间在36左右
System.out.println(System.currentTimeMillis()-start);上面的代码也是类似的,说明了StringBuilder与StringBuffer类似,但比StringBuffer的效率更改,这是为什么呢,看看源代码就知道了:)
源代码中StringBuffer与StringBuilder继承自同一个父类,代码极奇相似,只是StringBuilder各个函数少了synchonized关键字,这也就说明了StringBuilder不是线程安全的,即然有了synchronized关键字,那么代码每次运行的时候均需要锁住该对象,以避免其他对象调用该方法,不管是单线程还是多线程,因此这需要一定的开销,因此StringBuiler的效率要高于StringBuffer:)