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