发表新主题 回复该帖子
主题:测试了一下StringBuffer和普通+=的字符串拼接效率
jastby
帖子档案  楼主 测试了一下StringBuffer和普通+=的字符串拼接效率   Post by : 2008-11-12 16:28:24.0
  • 幼儿园
  • 幼儿园
  • UID:2
  • 主题:126
  • 帖子:219
  • 加为好友 加为好友    发送短信 发送短信

先说说 String 和 StringBuffer 的基本区别:
String类是字符串常量,是不可更改的常量。
StringBuffer是字符串变量,它的对象是可以扩充和修改的。

这里的"可变"和"不可变",和是不是final没有关系

举个例子:

String str1 = "hello";
String str2 = "world";
String str1 = str1 + str2;//这里所做的内部操作,其实不是把str1的内容改变为原str1+str2的内容这么简单, 而把创建一个新的String, 内容为str1 + str2的内容,然后再把str1这个引用重新指向新创建的String, 这就是上面说的String不可变.

而如果是StringBuffer的话,则直接更改str1的内容,而不是先创建一个新的StringBuffer

使用 StringBuffer 主要就是在性能上的考虑。

String 是一种非常常用的数据类型,但由于 String 是不可变对象,在进行 String 的相关操作的时候会产生许多临时的 String 对象。

而 StringBuffer 在操作上是在一个缓冲中进行的,性能当然优越得多。

不过,一般做为简单的字符串传递和其它操作,只不要改变字符串内容的操作,用 String 效率会高一些。

今天我就来简单地测试一下它们的效率:

   java代码
  1. public class JavawindNet_StringTest {  
  2.  
  3.     /**  
  4.      * @param args  
  5.      */ 
  6.     public static void main(String[] args) {  
  7.         // TODO Auto-generated method stub  
  8.         String addStr="www.javawind.net";  
  9.         String str="";  
  10.         StringBuffer buff = new StringBuffer();  
  11.         int n=10000;  
  12.           
  13.         long a = System.currentTimeMillis();  
  14.         for(int i=0;i<n;i++){  
  15.             str += addStr;  
  16.         }  
  17.         long b = System.currentTimeMillis();  
  18.         System.out.println("+= 串接 "+n+" 个 '"+addStr+" '耗时"+(b-a)+"毫秒");   
  19.           
  20.         long c = System.currentTimeMillis();  
  21.         for(int i=0;i<n;i++){  
  22.             buff.append(addStr);  
  23.         }         
  24.         long d = System.currentTimeMillis();                  
  25.         System.out.println("StringBuffer 串接 "+n+" 个 '"+addStr+"' 耗时"+(d-c)+"毫秒");         
  26.     }  

 

返回页面顶部  

jastby
2F Re:~   Post by : 2008-11-12 16:40:28.0
  • 幼儿园
  • 幼儿园
  • UID:2
  • 主题:126
  • 帖子:219
  • 加为好友 加为好友    发送短信 发送短信
改变了一下 n 的值,查看运行结果:

n=100:
+= 串接 100 个 ´www.javawind.net ´耗时0毫秒
StringBuffer 串接 100 个 ´www.javawind.net´ 耗时0毫秒

+= 串接 100 个 ´www.javawind.net ´耗时16毫秒
StringBuffer 串接 100 个 ´www.javawind.net´ 耗时0毫秒

n=1000:
+= 串接 1000 个 ´www.javawind.net ´耗时157毫秒
StringBuffer 串接 1000 个 ´www.javawind.net´ 耗时0毫秒

+= 串接 1000 个 ´www.javawind.net ´耗时172毫秒
StringBuffer 串接 1000 个 ´www.javawind.net´ 耗时0毫秒

n=3000:
+= 串接 3000 个 ´www.javawind.net ´耗时1641毫秒
StringBuffer 串接 3000 个 ´www.javawind.net´ 耗时16毫秒

n=5000:
+= 串接 5000 个 ´www.javawind.net ´耗时6578毫秒
StringBuffer 串接 5000 个 ´www.javawind.net´ 耗时16毫秒

当n=10000时就恐怖了 呵呵:
+= 串接 10000 个 ´www.javawind.net ´耗时35312毫秒
StringBuffer 串接 10000 个 ´www.javawind.net´ 耗时31毫秒

+= 串接 10000 个 ´www.javawind.net ´耗时42422毫秒
StringBuffer 串接 10000 个 ´www.javawind.net´ 耗时31毫秒

+= 串接 10000 个 ´www.javawind.net ´耗时44093毫秒
StringBuffer 串接 10000 个 ´www.javawind.net´ 耗时47毫秒

以上数据会因运行环境的计算机的性能和内存开销所影响,但是从相同环境的运行结果来看,StringBuffer 和 String 的操作的效率真的相差很大!
返回页面顶部  


CopyRight © 2008-2009 JavaWind.Net Studio All Rights Reserved
Powered By JWind.BBS Vesion 1.0.0 Beta1 Processed in 18 ms,0 (Queries)  Gzip enabled

WAP - 清除Cookies - 联系我们 - JavaWind.Net Studio - Archiver - TOP Valid XHTML 1.0 Transitional Valid CSS! 粤ICP备07511478号