现象
先写一段代码,看一下最终效果
long start1 = System.currentTimeMillis();
StringBuffer stringBuffer = new StringBuffer();
while(i<100000){
stringBuffer.append(i++);
}
android.util.Log.e("xxxx","stringbuffer "+(System.currentTimeMillis()-start1));
i= 0;
long start2 = System.currentTimeMillis();
StringBuilder sb = new StringBuilder();
while(i<100000){
sb.append(i+++1);
}
android.util.Log.e("xxxx","stringbuilder "+(System.currentTimeMillis()-start2));
i= 0;
long start3 = System.currentTimeMillis();
String s= "";
while(i<100000){
s = s+" 1" ;
i++;
}
android.util.Log.e("xxxx","String "+(System.currentTimeMillis()-start3));
经过10次之后,结果差不多是这样
stringbuffer 45
stringbuilder 41
String 131919
可以看到差距还是比较明显的
原因
Stirng
String 在java中是以对象的形式存在,所以每次进行+操作都会生成一个新的对象,造成堆空间的膨胀,也可以通过内存工具观察到内存的锯齿状的波动,对性能是一个很大的挑战。
StringBuilder
StirngBuilder 的实现是通过char[]的拷贝来完成,减少了对象的创建,相对String来说会好很多。 扩容时容量变两倍+2 append数据时,通过copy完成
StringBuffer
StringBuffer和StringBuilder实现很相似,只是对char[]进行操作的方法上加上了synchronized可重入锁。 保证了多线程下的线程安全。