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(); } }