String & StringStringBuilder & StringBuffer对比

124 阅读1分钟

现象

先写一段代码,看一下最终效果


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可重入锁。 保证了多线程下的线程安全。