String 拼接的方法选择
在拼接静态字符串时,尽量用 +,因为通常编译器会对此做优化,如:
String test = "this " + "is " + "a " + "test " + "string"
编译器会把它视为:
String test = "this is a test string"
在拼接动态字符串时,尽量用 StringBuffer
或 StringBuilder
的 append
,这样可以减少构造过多的临时 String 对象。
测试代码:(按照附录1修改)
1 public class teststring { 2 3 public void testPlus() { 4 String s = ""; 5 long ts = System.currentTimeMillis(); 6 for (int i = 0; i < 10000; i++) { 7 s = s + String.valueOf(i); 8 } 9 long te = System.currentTimeMillis(); 10 System.out.println("+ cost {} ms "+( te - ts)); 11 } 12 13 public void testConcat() { 14 String s = ""; 15 long ts = System.currentTimeMillis(); 16 for (int i = 0; i < 10000; i++) { 17 s = s.concat(String.valueOf(i)); 18 } 19 long te = System.currentTimeMillis(); 20 System.out.println("concat cost {} ms "+ (te - ts)); 21 } 22 23 24 public void testStringBuffer() { 25 StringBuffer sb = new StringBuffer(); 26 long ts = System.currentTimeMillis(); 27 for (int i = 0; i < 10000; i++) { 28 sb.append(String.valueOf(i)); 29 } 30 sb.toString(); 31 long te = System.currentTimeMillis(); 32 System.out.println("StringBuffer cost {} ms "+(te - ts)); 33 } 34 35 public void testStringBuilder() { 36 StringBuilder sb = new StringBuilder(); 37 long ts = System.currentTimeMillis(); 38 for (int i = 0; i < 100000; i++) { 39 sb.append(String.valueOf(i)); 40 } 41 sb.toString(); 42 long te = System.currentTimeMillis(); 43 System.out.println("StringBuilder cost {} ms "+(te - ts)); 44 } 45 46 public static void main(String[] args) { 47 teststring a = new teststring(); 48 a.testConcat(); 49 a.testPlus(); 50 a.testStringBuffer(); 51 a.testStringBuilder(); 52 } 53 }
运行结果:
concat cost {} ms 113
+ cost {} ms 195
StringBuffer cost {} ms 2
StringBuilder cost {} ms 9
附录:
1 Java 5种字符串拼接方式性能比较 http://blog.csdn.net/kimsoft/article/details/3353849
2 Java 性能优化之 String 篇 http://www.ibm.com/developerworks/cn/java/j-lo-optmizestring/
时间: 2024-11-05 11:42:14