StringBuffer的拼接效率小细节

Posted 酒皇

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了StringBuffer的拼接效率小细节相关的知识,希望对你有一定的参考价值。

最近看项目代码发现经常StringBuffer拼接SQL里面有这样的代码sql.append("select * from XXX where xxx="+xxx+" and yyy="+yyy);

于是我很好奇这样写是按顺序连续append还是先创建一个StringBuffer对象append全部String,然后再传送到sql对象中去

实践检验代码如下

    public static void main(String[] args){
        t(9);
        
    }
    private static void t( int q){
        StringBuffer sb=new StringBuffer();
        long start=System.currentTimeMillis();
        for(int i=0;i<200000;i++){
            sb.append("11111111111111"+q+"11111111111111"+q+"111111111111111"+q);
        }
        long end=System.currentTimeMillis();
        long start2=System.currentTimeMillis();
        for(int i=0;i<200000;i++){
            sb.append("11111111111111");
            sb.append(q);
            sb.append("11111111111111");
            sb.append(q);
            sb.append("11111111111111");
            sb.append(q);
            
        }
        long end2=System.currentTimeMillis();
        
        long start3=System.currentTimeMillis();
        for(int i=0;i<200000;i++){
            sb.append("11111111111111"+q);
            sb.append("11111111111111"+q);
            sb.append("11111111111111"+q);
            
        }
        long end3=System.currentTimeMillis();
        System.out.println(start-end);
        System.out.println(start2-end2);
        System.out.println(start3-end3);
    }
    //console输出如下:
    //-140
    //-31
    //-125

备注:

因为预编译会把所有已知的String拼接成一起,所以拼接中必须要是未知数。

String的每一次拼接参数会创建一个StringBuffer对象,单条String拼接次数越多耗费StringBuffer创建资源也就越多。

结论:

StringBuffer的拼接过程中应该尽量保证已知String与未知变量分离sppend,可节约资源。

 

以上是关于StringBuffer的拼接效率小细节的主要内容,如果未能解决你的问题,请参考以下文章

StringBuffer与StringBuilder的区别

对字符串进行频繁拼接的话,使用StringBuffer或者StringBuilder

AJPFX关于StringBuffer,StringBuilder类 总结

实例的对比StringStringBuilder字符串的连接效率及StringBuilder和StringBuffer线程安全的比较

扯皮系列一篇与众不同的 StringStringBuilder 和 StringBuffer 详解

扯皮系列一篇与众不同的 StringStringBuilder 和 StringBuffer 详解