天天看点

Java StringBuffer 和StringBuilder

其实在上面的文章中我已经阐述过了什么是string,其实,string三姐妹中还有两个非常丰满的存在:stringbuffer老大姐和stringbuilder小妹妹.

首先,前面我们说过string是不能被修改的,无论你如何对string进行赋值(+)都会在字符串常连池里面生成一个值.并且把这个值得地址引用给string变量,所以,只要是玩string后面添加东西,都是创建一个全新的javastring对象.这样,我们可以来做个实验:

//本来

一开始是想计算五百次的string添加计算的,kanla9ishi天真了,那么五万次呢....

输出:

string 总共耗时为: 6秒

现在来看stringbuffderder的情况:注意时间单位

stringbuffer 总共耗时为: 308毫秒

然后...

.stringbudiler: 总共耗时为: 240毫秒

大家可以很明显的看出来了是怎么一回事.string循环五万次,了6000毫秒,而stringbuffer循环添加五百万个只用了300毫秒!!!当然stringbuilder只用了200毫秒.我的天,这是什么情况?

其实,为什么string三姐妹这件的差距这么的,就在于我开篇所说的,对于string来说,没错往已有的字符串后面追加内容,都是一个新的对对象,是对象就需要去给他开辟内存等等一些列复杂的炒作,但是,记住,但是@@@stringbuffer和stringbudiler在已有的字符串后面追加,其实是在修应该这个已经存在了的string对象,而没有创建新的对象!这既是为什么有这么大差距的原因了..是的,就是这样的....

那么...下一个问题.为什么会有两个高速修改字符类型的类?stringbuffer和stringbudiler?

其实从上面的数据也可以看出一点,stringbuffer的速度没有strinhbuilder的速度快的,这是因为,stringbuffer是一个线程安全的类,你可以从他的源代码看到他的所有方法第都添加了synchronized关键字来保证线程安全.而stringbuild没有这种限制.如何选择就得看你的业务觉得了.

最后一个问题.stringbuffer和stringbudiler还有提升速度的空间吗?

答案是有的.通过分析源代码我们可以看到一个非常现实的东西,那就是,sb们都有一个初始的容量.其值为16

stringbuffer的初始容量: 16

stringbuilder的初始容量: 16

容量是什么?容量就是这个sb能装多少的内容!这枚理解没毛病的

stringbuffer的现有容量: 19

stringbuilder的现有容量: 19

以此可以看出,容量是可以改变的,那么他是在什么时候去改变你的呢?

看源代码:

添加long新类型时:

public abstractstringbuilder append(int i) {

}

class stringbuffertest2{

class stringbudilertest2{