美文网首页程序员
五种拼接字符串的效率比较

五种拼接字符串的效率比较

作者: justlinzhihe | 来源:发表于2018-01-01 09:56 被阅读0次
    public class Test {
        List<String> list = new ArrayList<>();
    
    
        @Before
        public void init(){
            IntStream.range(0, 100000).forEach((index) -> {
                list.add("str" + index);
            });
        }
    
        @org.junit.Test
        public void test1() {
            String ss = "";
            long startTime = System.currentTimeMillis();
            for (String s : list) {
                ss += s;
            }
            System.out.println(System.currentTimeMillis() - startTime);
        }
    
        @org.junit.Test
        public void test2() {
            String ss = "";
            long startTime = System.currentTimeMillis();
            for (String s : list) {
                ss=ss.concat(s);
            }
            System.out.println(System.currentTimeMillis() - startTime);
        }
    
        @org.junit.Test
        public void test3() {
            StringBuilder ss = new StringBuilder();
            long startTime = System.currentTimeMillis();
            for (String s : list) {
                ss.append(s);
            }
            System.out.println(System.currentTimeMillis() - startTime);
        }
    
        @org.junit.Test
        public void test4() {
            long startTime = System.currentTimeMillis();
            StringUtils.join(list);
            System.out.println(System.currentTimeMillis() - startTime);
        }
    
        @org.junit.Test
        public void test5() {
            StringBuffer ss = new StringBuffer();
            long startTime = System.currentTimeMillis();
            for (String s : list) {
                ss.append(s);
            }
            System.out.println(System.currentTimeMillis() - startTime);
        }
    
    }
    

    第一种:33809

    第二种:8851

    第三种:6

    第四种:12

    第五种:7

    性能:StringBuilder>StringBuffer>StringUtils.join>concat>+
    然后从源码层面分析下

    StringBuilder:

    image.png

    每次字符串拼接都只是扩展内部char数组,只生产一个最终的string,所以这种效率最高

    StringBuffer:

    image.png

    与StringBuilder相比只是多加了个synchronized,所以在单线程的情况下相差不大

    StringUtils.join:

    image.png
    image.png

    可以看到其内部还是用StringBuilder实现,但是每次循环都多了个分隔符的判断所以慢了一点,但是也不多,时间上来讲是一个数量级的

    concat:

    image.png

    可以看出每次连接都会生成一个string,所以效率很低

    +:

    因为是重载的运算符,找不到源码,但是从结果来看效率最低

    相关文章

      网友评论

        本文标题:五种拼接字符串的效率比较

        本文链接:https://www.haomeiwen.com/subject/opozgxtx.html