拼接字符串+,StringBuilder,StringUtils.join,StringJoiner(JDK8)

+拼接的时候底层会使用StringBuilder,如果是非循环体和使用StringBuilder相差无几,如果是循环体,就会在循环体内每次循环的时候new一个StringBuilder对象,创建很多次对象,造成运行效率下降。

5种方法用时比较:
StringBuilder<StringBuffer<concat<+<StringUtils.join
StringUtils.join效率应该没有很差,这里应该不准确
总结:
1、如果不是在循环体中进行字符串拼接的话,直接使用+就好了。
2、如果在并发场景中进行字符串拼接的话,要使用StringBuffer来代替StringBuilder
3、StringUtils.join用于将数组元素用某个字符串拼接起来
4、Java8新增了StringJoiner用于将list拼成字符串

StringJoiner例子,其中参数是分隔符

StringJoiner stringJoiner = new StringJoiner(";");
stringJoiner.add("a").add("b").add("c");
System.out.println(stringJoiner.toString());   //a,b,c

以下代码比较了将list转为‘,’拼接的字符串三种方法的效率

import org.apache.commons.lang3.StringUtils;
import org.springframework.util.StopWatch;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

public class GhwTest {

    public static void main(String[] args) {
        List<String> list = new ArrayList<String>();
        //构造字符串list
        for (int i = 0; i < 100000; i++) {
            list.add(String.valueOf(i));
        }
        StopWatch stopWatch = new StopWatch();

        stopWatch.start("Commons的StringUtils");
        // 1.使用Apache Commons的StringUtils
        String str1 = StringUtils.join(list.toArray(), ",");
        // 2.通过遍历
        stopWatch.stop();

        stopWatch.start("迭代器拼接");
        StringBuilder str2 = new StringBuilder();
        for (Iterator<String> iterator = list.iterator(); iterator.hasNext(); ) {
            String string = iterator.next();
            str2.append(string);
            if (iterator.hasNext()) {
                str2.append(",");
            }
        }
        stopWatch.stop();

        String result = "";
        stopWatch.start("for循环拼接");
        for (String str : list) {
            result += "str" + ",";
        }
        if (result.endsWith(",")) {
            result = result.substring(0, result.length() - 1);
        }
        stopWatch.stop();
        System.out.println(stopWatch);
        //StopWatch '': running time (millis) = 13795; 
        [Commons的StringUtils] took 123 = 1%; 
        [迭代器拼接] took 0 = 0%; 
        [for循环拼接] took 13672 = 99%
    }
}

从运行结果可以看出for循环拼接的效率最低,建议使用StringUtils的join方法,
经过测试join方法有俩个,其中数组的效率比迭代器的高

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容