版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/lxfHaHaHa/article/details/87552246
Java有String/StringBuilder/StringBuffer这三个类,那我们平时使用字符串拼接的时候哪个性能高呢?
如下代码,分别比较String、StringBuilder、StringBuffer在运行100000此字符串拼接耗时:
public class Test {
public static void main(String[] args) {
int runnum = 100000;
System.out.println("运行" + runnum + "次:");
String a = "";
long tim1 = System.currentTimeMillis();
for (int i = 0; i < runnum; i++)
a += "1";
long tim2 = System.currentTimeMillis();
System.out.println(("普通str连接用时:" + (tim2 - tim1) + "毫秒"));
StringBuilder sb = new StringBuilder();
tim1 = System.currentTimeMillis();
for (int i = 0; i < runnum; i++)
sb.append("1");
tim2 = System.currentTimeMillis();
System.out.println(("stringbuilder+append连接用时:" + (tim2 - tim1) + "毫秒"));
StringBuffer sf = new StringBuffer();
tim1 = System.currentTimeMillis();
for (int i = 0; i < runnum; i++)
sf.append("1");
tim2 = System.currentTimeMillis();
System.out.println(("stringbuffer+append连接用时:" + (tim2 - tim1) + "毫秒"));
}
}
嗯 String完败,StringBuilder和StringBuffer差不多,为什么呢?
因为对String的操作,我们并没有在原对象的基础上进行append,而是生成了新的对象,,这么一想上面的每一次操作,都申请内存生成了一个新的对象,频繁操作下,无怪乎效率如此低下。
结论:
- 对String对象的任何改变都不影响到原对象,相关的任何change操作都会生成新的对象
- 频繁的字符串拼接操作切记不可用String
那么,StringBuilder和StringBuffer呢?我们提高运行的次数1000000:
差距拉开了,StringBuilder有优势了,继续,变为10000000次(我将String的给注释掉了。。一把王者都打完了都还没跑完,太痛苦了):
嗯,结果很明显了,StringBuilder比StringBuffer效率又要高点,这又是为什么呢?
从StringBuffer的append方法的源码可知,看到了synchronized关键字,原来它是线程安全的,每次只有一个线程能访问资源,所以在大数量的append操作时,比线程不安全的StringBuilder效率要低一点。
结论:
- StringBuffer线程安全,适合多线程编程的时候使用
- StringBuilder线程不安全,但效率比StringBuffer高