java中拼接字符串的5种方法效率对比

示例代码: 

import org.apache.commons.lang3.StringUtils;
import org.junit.Before;

import java.util.ArrayList;
import java.util.List;
import java.util.stream.IntStream;

/**
 * @author : Jzm
 * @Date : Created on 2019/6/12.
 */
public class Test {

    List 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("concat:"+(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("concat:"+(System.currentTimeMillis() - startTime));
    }
    @org.junit.Test
    public void test4() {
        long startTime = System.currentTimeMillis();
        StringUtils.join(list);
        System.out.println("join:"+(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("StringBuffer:"+(System.currentTimeMillis() - startTime));
    }
}

执行结果:

+:102525

concat:24605

StringBuilder:17

join:36

StringBuffer:22

分析:

 

时间角度:

StringBuilder < StringBuffer < join < concat < +

源码角度:

StringBuilder

java中拼接字符串的5种方法效率对比_第1张图片

每次的字符串拼接是在对内部char做扩充,最终只生成一个String。

StringBuffer

java中拼接字符串的5种方法效率对比_第2张图片

StringBuffer与StringBuilder 底层调用一样,差别在关键字,若是单线程状态下差别不大。

join

java中拼接字符串的5种方法效率对比_第3张图片

 join 底层 调用StringBuilder ,多了些判断虽然是慢些,但总归是同一数量级。

 concat

 java中拼接字符串的5种方法效率对比_第4张图片

每次拼接都会产生一个新的String对象,所以效率会有所降低。

“+”

连接符,因找不到源码只能从时间维度分析。

你可能感兴趣的:(java)