按特定分隔符拼接字符串的效率比较

文章比较了Java中String、StringBuffer、StringBuilder和StringJoiner的字符串拼接方式,发现从4K次拼接后,不同策略的性能差异显现,尤其是从20W次开始,StringJoiner和避免在循环内拼接首项的方式更优。
摘要由CSDN通过智能技术生成

字符串拼接的几种方式

  • String直接拼接
  • StringBuffer
  • StringBuilder
  • StringJoiner(从jdk8开始支持,其拼接思想与方式四类似)

        上述几个方式中,String直接拼接的方式无疑是最慢的。因为每次拼接都要开辟新的空间,只要简单测试,拼接百次,就会出现很大的差别,本文不予关注。 

StringBuffer和StringBuilder

        两个类的api接口基本一致,区别在于StringBuffer是线程安全的,对所有的操作方法都使用了synchronized关键字;StringBuilder是非线程安全的。在单线程的场景下,推荐使用StringBuilder,多线程场景下,需使用StringBuffer。由于StringBuffer的多线程安全性,使它的效率相对来说会差一些(达到一定的拼接次数才会显示差异)。

 本文主要关注的场景为按照一定格式拼接字符串,最终格式如:a,b,c

实现方式

  1. 拼接方式1 判断是否为最后一个拼接项,如果是,则不拼接分隔符
  2. 拼接方式2 拼接完成后,对结果进行截取(先拼接内容,再拼接分隔符)
  3. 拼接方式3 拼接完成后,对结果进行截取(先拼接分隔符,再拼接分隔符)
  4. 拼接方式4 第一个拼接项不再循环内进行,拼接完成后,直接为需要的结果
public class TestString {
    public static void main(String[] args) {
        int times = 100000;

        // 拼接方式1 判断是否为最后一个拼接项,如果是,则不拼接分隔符
        long startTime = System.currentTimeMillis();
        StringBuffer sb1 = new StringBuffer();
        for (int i = 0; i <= times; i++) {
            if(i == times){
                sb1.append("abc");
            }else{
                sb1.append("abc").append(",");
            }
        }
        String s = sb1.toString();
        System.out.println(String.valueOf(System.currentTimeMillis() - startTime));

        // 拼接方式2 拼接完成后,对结果进行截取(先拼接内容,再拼接分隔符)
        startTime = System.currentTimeMillis();
        StringBuffer sb2 = new StringBuffer();
        for (int i = 0; i <= times; i++) {
            sb2.append("abc").append(",");
        }
        String substring = sb2.substring(0, sb2.length() - 1);
        System.out.println(String.valueOf(System.currentTimeMillis() - startTime));

        // 拼接方式3 拼接完成后,对结果进行截取(先拼接分隔符,再拼接分隔符)
        startTime = System.currentTimeMillis();
        StringBuffer sb3 = new StringBuffer();
        for (int i = 0; i <= times; i++) {
            sb3.append(",").append("abc");
        }
        String substring2 = sb2.substring(1);
        System.out.println(String.valueOf(System.currentTimeMillis() - startTime));

        // 拼接方式4 第一个拼接项不再循环内进行,拼接完成后,直接为需要的结果
        startTime = System.currentTimeMillis();
        StringBuffer sb4 = new StringBuffer();
        sb4.append("abc");
        for (int i = 1; i <= times; i++) {
            sb4.append(",").append("abc");
        }
        String s1 = sb4.toString();
        System.out.println(String.valueOf(System.currentTimeMillis() - startTime));
    }

}

测试结果

测试耗时单位为ms

拼接次数方式一方式二方式三方式四
4K1111
5K2111
1W3321
5W6343
10W10866
20W22161413

 结果分析

        基于上述测试结果,拼接次数在4000次及一下,四种拼接方式耗时无明显差异;

        从5000次开始,方式一的耗时开始比其他方式增多;

        从1W次开始,方式二的耗时开始多于方式三、四;

        方式三和四在多次测试中,总体耗时相差不多,从20W次开始,方式四为最优选择;

总结

        在多数应用场景中,并不需要特别大量的字符串拼接,可按照实际应用场景选择自己需要的,喜欢的方式即可。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值