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<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("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

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

StringBuffer

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

join

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

 concat

 

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

“+”

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

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值