package jef.testbase; import java.io.IOException; import jef.common.wrapper.IntRange; import jef.tools.StringUtils; import jef.tools.ThreadUtils; import jef.tools.string.CharUtils; import jef.tools.string.RandomData; import org.junit.BeforeClass; import org.junit.Test; public class StringAddTest { private static String s1; private static String s2; private static String s3; private static String s4; private static String s5; private static String s6; private static final int LOOP_TIMES=500; public static void main(String[] args) { ThreadUtils.doSleep(12000); for(int i=0;i<10;i++){ Task t=new Task(); t.start(); } Task t=new Task(); t.run(); } static class Task extends Thread{ @Override public void run() { for(int i=0;i<100;i++){ StringAddTest t=new StringAddTest(); try{ StringAddTest.setup(); t.test3(); t.test4(); t.test5(); t.testx(); }catch(Exception e){ e.printStackTrace(); } } } } @BeforeClass public synchronized static void setup() throws IOException{ s1="asdkjslfnlsdfndskjgndkjgnkjdsfbgkdjfgndfkjgndfka"; s3="sad"; s4="csdklgnfkldngfdlkgd"; s5="csfdfmslkfmldsfmsd"; s6="cdskfkkkkdkaskldlksdmklsdmkldsfmdkslfmdslkfmdfgndflgfdnfdjd"; s2=StringUtils.repeat(s6, 1000);//通过重复生成一个很长的字符串 System.out.println("s1 length=" + s1.length()); System.out.println("s2 length=" + s2.length()); System.out.println("s3 length=" + s3.length()); } //JDK5以后教科书提供的标准方法,但其实比test1快不了多少(5734ms) @Test public void test3(){ long start=System.currentTimeMillis(); for(int i=0;i<LOOP_TIMES;i++){ String x=new StringBuilder(s1).append(s2).append(s3).append(s4).append(s5).append(s6).toString(); } long cost=System.currentTimeMillis()-start; System.out.println("==== the method test3 cost " + cost+"ms."); } //优化后的方法,性能已经明显提高了。使用StringBuilder的极限也就是这样了(2969ms) @Test public void test4(){ long start=System.currentTimeMillis(); for(int i=0;i<LOOP_TIMES;i++){ String x=new StringBuilder(s1.length()+s2.length()+s3.length()+s4.length()+s5.length()+s6.length()).append(s1).append(s2).append(s3). append(s4).append(s5).append(s6).toString(); } long cost=System.currentTimeMillis()-start; System.out.println("==== the method test4 cost " + cost+"ms."); } //JDK String内建的方法。 //无论怎么变化String大小和循环次数,一定是最快和内存占用最少的方法(2078ms) @Test public void test5(){ long start=System.currentTimeMillis(); for(int i=0;i<LOOP_TIMES;i++){ String x=s1.concat(s2).concat(s3).concat(s4).concat(s5).concat(s6); } long cost=System.currentTimeMillis()-start; System.out.println("==== the method test5 cost " + cost+"ms."); } //JDK String内建的方法。 //无论怎么变化String大小和循环次数,一定是最快和内存占用最少的方法(2078ms) @Test public void testx(){ long start=System.currentTimeMillis(); for(int i=0;i<LOOP_TIMES;i++){ String x=StringUtils.concat(s1,s2,s3,s4,s5,s6); } long cost=System.currentTimeMillis()-start; System.out.println("==== the method testx cost " + cost+"ms."); } @Test public void aa(){ String a=RandomData.randomString(CharUtils.ALPHA_NUM_UNDERLINE, new IntRange(256,256)); String b=new String(a); String c=new String(a); long start=System.nanoTime(); for(int i=1;i<10000;i++){ String d=a+b+c; } long x=System.nanoTime(); System.out.println(x-start); } public void call(){ } }