String,StringBuffer还是StringBuilder
??????????? + (over - begin) + " 毫秒 " );???????
??? }
??? public void test(StringBuffer s){
?
??????? long begin = System.currentTimeMillis();
??????? for(int i=0;i<ttime;i++){
??????????? s.append("add");
??????? }
??????? long over = System.currentTimeMillis();
??????? System.out.println(" 操作 "+s.getClass().getName()+" 类型使用的时间为: "
??????????? + (over - begin) + " 毫秒 " );???????
??? }
??? public void test(StringBuilder s){
??????? long begin = System.currentTimeMillis();
??????? for(int i=0;i<ttime;i++){
??????????? s.append("add");
??????? }
??????? long over = System.currentTimeMillis();
??????? System.out.println(" 操作 "+s.getClass().getName()+" 类型使用的时间为: "
??????????? + (over - begin) + " 毫秒 " );???????
??? }
??? // 对 String 直接进行字符串拼接的测试
??? public void test2(){
??????? String s2 = "abadf";
??????? long begin = System.currentTimeMillis();
??????? for(int i=0;i<ttime;i++){
??????????? String s = s2 + s2 + s2 ;
??????? }
??????? long over = System.currentTimeMillis();
??????? System.out.println(" 操作字符串对象引用相加类型使用的时间为: "
??????????? + (over - begin) + " 毫秒 " );???????
??? }
??? public void test3(){
??????? long begin = System.currentTimeMillis();
??????? for(int i=0;i<ttime;i++){
??????????? String s = "abadf" + "abadf" + "abadf" ;
??????? }
??????? long over = System.currentTimeMillis();
??????? System.out.println(" 操作字符串相加使用的时间为: "
??????????? + (over - begin) + " 毫秒 " );???????
??? }
???
??? public static void main(String[] args){
??? String s1 ="abc";
??? StringBuffer sb1 = new StringBuffer("abc");
??? StringBuilder sb2 = new StringBuilder("abc");
??? testssb t = new testssb();
??? t.test(s1);
??? t.test(sb1);
??? t.test(sb2);
??? t.test2();
??? t.test3();
??? }
}?
?
以上代码在 NetBeans 5.0 IDE/JDK1.6 上编译通过
循环次数 ttime 为 10000 次的测试结果如下:
操作 java.lang.String 类型使用的时间为: 4392 毫秒
操作 java.lang.StringBuffer 类型使用的时间为: 0 毫秒
操作 java.lang.StringBuilder 类型使用的时间为: 0 毫秒
操作字符串对象引用相加类型使用的时间为: 15 毫秒
操作字符串相加使用的时间为: 0 毫秒?
?
好像还看不出 StringBuffer 和 StringBuilder 的区别,把 ttime 加到 30000 次看看:
操作 java.lang.String 类型使用的时间为: 53444 毫秒
操作 java.lang.StringBuffer 类型使用的时间为: 15 毫秒
操作 java.lang.StringBuilder 类型使用的时间为: 15 毫秒
操作字符串对象引用相加类型使用的时间为: 31 毫秒
操作字符串相加使用的时间为: 0 毫秒?
?
StringBuffer 和 StringBuilder 的性能上还是没有太大的差异,再加大到 100000 看看,这里就不加入对 String 类型的测试了,因为对 String 类型这么大数据量的测试会很慢滴……
操作 java.lang.StringBuffer 类型使用的时间为: 31 毫秒
操作 java.lang.StringBuilder 类型使用的时间为: 16 毫秒?
?
能看出差别了,但其中有多次的测试结果居然是 StringBuffer 比 StringBuilder 快,再加大一些到 1000000 看看(应该不会当机吧?):
操作 java.lang.StringBuffer 类型使用的时间为: 265 毫秒
操作 java.lang.StringBuilder 类型使用的时间为: 219 毫秒?
?
有些少区别了,而且结果很稳定,再大点看看, ttime = 5000000 :
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
呵呵,算了,不去测试了,基本来说都是在性能上都是 StringBuilder > StringBuffer > String 的了。
其实我这里测试并不是很公平,因为都放在了一起以先后顺序进行,测试方法中间没有考虑到JVM的GC收集前面产生的无引用对象垃圾而对执行过程的中断时间。如果大家有更好的想法或者思路欢迎跟我讨论:chenpengyi#gmail.com。
?