黑马程序员技术交流社区

标题: 验证字符串直接相加和StringBuilder效率高低。 [打印本页]

作者: 胡建彪    时间: 2012-10-26 11:44
标题: 验证字符串直接相加和StringBuilder效率高低。
//验证字符串直接相加的低效。
public class StringConcatCount {

    String  str;
    String  str1;
    int runtimes =10000;
    StringBuilder  sb = new StringBuilder();
    public long plusTime(){                                 //直接相加。
        long beginTime  = System.currentTimeMillis();
        for(int i=0;i<runtimes; i++){
            str +="a"+"b";
        }
        long endTime = System.currentTimeMillis();
        return  endTime-beginTime;
    }
   
    public long StringConcatTime(){               // 调用concat方法。
        long beginTime  = System.currentTimeMillis();
        for(int i=0;i<runtimes; i++){
            str1 +="a".concat("b");
        }
        long endTime = System.currentTimeMillis();
        return  endTime-beginTime;
    }
   
    public long StringBuiderTime(){               // 用StringBuilder或者是StringBuffer。
        long beginTime  = System.currentTimeMillis();
        for(int i=0;i<runtimes; i++){
            sb.append("a");
            sb.append("b");
        }
        long endTime = System.currentTimeMillis();
        return  endTime-beginTime;
    }
    public static void main(String[] args) {
        
        StringConcatCount scc = new StringConcatCount();
        System.out.println(scc.plusTime());
        System.out.println(scc.StringConcatTime());
        System.out.println(scc.StringBuiderTime());      
    }
}
有这样一种解释: String str = "a" + s; 这样子的,其效率与String str = new StringBuilder().append("a").append(s).toString();是一样的。
那么是不是说:每做一次 + 就产生个 StringBuilder对象,然后 append 后就扔掉。下次循环再到达时重新产生个 StringBuilder对象,
                        然后 append字符串,如此循环直至结束。如果我们直接采用 StringBuilder 对象进行 append 的话,我们可以节省 N-1次创建和销毁对象的时间。
这样的话从内存优化的角度来说,用StringBuffer或者是StringBuilder代替字符串相加不失为一种方法。
欢迎大神们来讨论。






欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2