JAVA的字符串拼接與性能

package javaBasic;

import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * JAVA的字符串拼接與性能
 * 
 * @author markGao
 * 
 *         咱們將執行20個拼接」*」50,000次的測試。下面是咱們將使用到的拼接字符串的方法:
 */
public class StringAndStrBuffAndStrBuilderCompare {

    private static final int OUTER_ITERATION = 20;
    private static final int INNER_ITERATION = 50000;

    String addTestStr = "";

    String concatTestStr = "";

    StringBuffer concatTestSb = null;

    StringBuilder concatTestSbu = null;

    SimpleDateFormat sdFormat = new SimpleDateFormat("yyyyMMddhhmmssSSS");

    StringAndStrBuffAndStrBuilderCompare() {

    }

    public void test() {

        System.out.println("StringAddConcat " + sdFormat.format(new Date()));

        for (int outerIndex = 0; outerIndex <= OUTER_ITERATION; outerIndex++) {
            addTestStr = "";
            for (int innerIndex = 0; innerIndex <= INNER_ITERATION; innerIndex++)
                addTestStr += "*";
        }
        System.out.println("StringAddConcat " + sdFormat.format(new Date()));

        System.out.println("StringConcat " + sdFormat.format(new Date()));
        for (int outerIndex = 0; outerIndex <= OUTER_ITERATION; outerIndex++) {
            concatTestStr = "";
            for (int innerIndex = 0; innerIndex <= INNER_ITERATION; innerIndex++)
                concatTestStr.concat("*");
        }
        System.out.println("StringConcat " + sdFormat.format(new Date()));

        System.out.println("StringBufferConcat " + sdFormat.format(new Date()));
        for (int outerIndex = 0; outerIndex <= OUTER_ITERATION; outerIndex++) {
            concatTestSb = new StringBuffer();
            for (int innerIndex = 0; innerIndex <= INNER_ITERATION; innerIndex++)
                concatTestSb.append("*");
        }
        System.out.println("StringBufferConcat " + sdFormat.format(new Date()));

        System.out
                .println("StringBuilderConcat " + sdFormat.format(new Date()));
        for (int outerIndex = 0; outerIndex <= OUTER_ITERATION; outerIndex++) {
            concatTestSbu = new StringBuilder();
            for (int innerIndex = 0; innerIndex <= INNER_ITERATION; innerIndex++)
                concatTestSbu.append("*");
        }
        System.out
                .println("StringBuilderConcat " + sdFormat.format(new Date()));

    }

    /**
     * 這段代碼是String.concat()的字節碼,從這段代碼中,咱們能夠清楚的看到,concat()方法使用了
     * StringBuilder,concat()的性能應該和StringBuilder的同樣好,可是因爲額外的建立StringBuilder和
     * 作.append(str).append(str).toString()的操做,使得concate的性能會受到一些影響,因此
     * StringBuilder和String Cancate的時間是1.8和3.3。
     * 
     * 所以,即時在作最簡單的拼接時,若是咱們不想建立StringBuffer或StringBuilder實例使,咱們也因該使用concat。
     * 可是對於大量的字符串拼接操做,咱們就不該該使用concat(譯者注:因
     * 爲測試代碼功能上並不徹底等價,更換後的測試代碼concat的平均處理時間是1650.9毫秒。這個結果在原文的評論裏面。),由於concat會下降
     * 你程序的性能,消耗你的cpu。所以,在不考慮線程安全和同步的狀況下,爲了得到最高的性能,咱們應儘可能使用StringBuilder
     * 
     * @param args
     */

    public static void main(String[] args) {
        StringAndStrBuffAndStrBuilderCompare test = new StringAndStrBuffAndStrBuilderCompare();
        test.test();
    }

}
相關文章
相關標籤/搜索