java的String、StringBuilder、StringBuffer拼接速度比较

版权声明:本文为博主原创文章,未经博主允许不得转载。 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,而是生成了新的对象,,这么一想上面的每一次操作,都申请内存生成了一个新的对象,频繁操作下,无怪乎效率如此低下。

结论:

  1. 对String对象的任何改变都不影响到原对象,相关的任何change操作都会生成新的对象
  2. 频繁的字符串拼接操作切记不可用String

那么,StringBuilder和StringBuffer呢?我们提高运行的次数1000000:
在这里插入图片描述
差距拉开了,StringBuilder有优势了,继续,变为10000000次(我将String的给注释掉了。。一把王者都打完了都还没跑完,太痛苦了):
在这里插入图片描述
嗯,结果很明显了,StringBuilder比StringBuffer效率又要高点,这又是为什么呢?
在这里插入图片描述
从StringBuffer的append方法的源码可知,看到了synchronized关键字,原来它是线程安全的,每次只有一个线程能访问资源,所以在大数量的append操作时,比线程不安全的StringBuilder效率要低一点。

结论:

  1. StringBuffer线程安全,适合多线程编程的时候使用
  2. StringBuilder线程不安全,但效率比StringBuffer高

猜你喜欢

转载自blog.csdn.net/lxfHaHaHa/article/details/87552246
今日推荐