论坛首页 入门技术论坛

几种拼接字符串的效率问题

浏览 5462 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2009-01-09  
每次拼接字符串的时候用习惯了String,从来没想过用其他的class,最近看了看java性能的一些介绍书籍,很多东西以前都没想到,哎,还是经验太少。
拼接字符串,大致有3个class可以用,他们是String, StringBuffer,StringBuilder, StringBuilder是1.5中来代替StringBuffer的,我用的检验方法很简单,

就是
 long start = System.currentTimeMillis();
     //code here...
     long end = System.currentTimeMillis();
     long time = end -start;
     System.out.println(time);

其实我也不知道使用别的什么其他方法,许多工具可以检查性能,不过我基本没怎么用过。
    “+=”看起来效率高,比较短小,其实性能远不如append,看代码

public class StringTest
{
	public static void main(String[] args)
	{
		long start = System.currentTimeMillis();
		String s = new String("hello");
		for (int i = 0; i < 15000; i++)
		{
			s+=i;
		}
		long end = System.currentTimeMillis();
		long time = end -start;
		System.out.println("用String +=拼接字符串的时间"+time);
		
		long start1 = System.currentTimeMillis();
		StringBuffer sb = new StringBuffer("hello");
		for (int i = 0; i < 15000; i++)
		{
			sb.append(i);
		}
		long end1 = System.currentTimeMillis();
		long time1 = end1 -start1;
		System.out.println("用StringBuffer append拼接字符串的时间"+time1);
		
		long start2 = System.currentTimeMillis();
		StringBuilder builder = new StringBuilder("hello");
		for (int i = 0; i < 15000; i++)
		{
			builder.append(i);
		}
		long end2 = System.currentTimeMillis();
		long time2 = end2 -start2;
		System.out.println("用StringBuilder append拼接字符串的时间"+time2);
	}
}
打印结果:
用String +=拼接字符串的时间3984
用StringBuffer append拼接字符串的时间31
用StringBuilder append拼接字符串的时间0

    当然这个时间取决于你计算机的速度,不过可以看出,Buffer和Buildr相差无几,而String就慢许多了
原因:
    查看程序的字节码,你就会明白了,原因是String类本身是final类型,他不能更改,所以拼接时,它会使用StringBuffer,并调用append,之后再调用toString方法,每次都要这样,StringBuffer再转换成String时,代价是很大的。这是它慢的主要的一些原因。不仅创立了临时对象StringBuffer,还每次完后再要转成String。
    而 StringBuilder的出现就是用来替换StringBuffer的,所以应该尽可能StringBuilder来拼接,将转为String的数量减至最少,降低对象的创建数,大大提高性能。
   发表时间:2009-04-24  
public class Test {

/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
        long start = System.currentTimeMillis();  
        String s = new String("hello");  
        for (int i = 0; i < 15000; i++)  
        {  
            s+="拼接字符串的时间";  
        }  
        long end = System.currentTimeMillis();  
        long time = end -start;  
        System.out.println("用String +=拼接字符串的时间"+time);  
          
        long start1 = System.currentTimeMillis();  
        StringBuffer sb = new StringBuffer("hello");  
        for (int i = 0; i < 15000; i++)  
        {  
            sb.append("拼接字符串的时间");  
        }  
        long end1 = System.currentTimeMillis();  
        long time1 = end1 -start1;  
        System.out.println("用StringBuffer append拼接字符串的时间"+time1);  
          
        long start2 = System.currentTimeMillis();  
        StringBuilder builder = new StringBuilder("hello");  
        for (int i = 0; i < 15000; i++)  
        {  
            builder.append("拼接字符串的时间");  
        }  
        long end2 = System.currentTimeMillis();  
        long time2 = end2 -start2;  
        System.out.println("用StringBuilder append拼接字符串的时间"+time2);  
}

}
===============================================
===============================================
用String +=拼接字符串的时间25406
用StringBuffer append拼接字符串的时间0
用StringBuilder append拼接字符串的时间15
0 请登录后投票
   发表时间:2009-04-24  
拼接的时候换成字符串,再看看结果
0 请登录后投票
   发表时间:2009-04-27  
1楼楼主你能否换个图片呀,这样给人看起来,真的非常难受。
别的就不多说了
0 请登录后投票
论坛首页 入门技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics