String-StringBuilder区别

 

 1   
 2 StringBuffer   是线程安全的 
 3 StringBuilder   不保证线程安全(在1.5中引入的),一般情况下比StringBuffer快
 4
 5 一个String对象的长度是固定的,不能改变它的内容,或者是附加新的字符至String对象中。您也许会使用 + 来串联字符串以达到附加新字符或字符串的目的,但 + 会产生一个新的String实例。如果程序对这种附加字符串的需求很频繁,并不建议使用 + 来进行字符串的串联。在面向对象程序设计中,最好是能重复运用已生成的对象,对象的生成需要内存空间与时间,不断地产生String实例是一个没有效率的行为。   
 6 J2SE    5 .0提供java.lang.StringBuilder类,使用这个类所产生的对象默认会有16个字符的长度,您也可以自行指定初始长度。如果附加的字符超出可容纳的长度,则StringBuilder对象会自动增加长度以容纳被附加的字符。如果有频繁作字符串附加的需求,使用StringBuilder会让程序的效率大大提高。通过下面的简单测试程序就可以知道效能差距有多大。   
 7 ü   范例6. 5      AppendStringTest.java                                                                                                               
 8 public     class    AppendStringTest    {   
 9        public   static   void   main(String[]   args)   {   
10                String   text   =   "";   
11
12                long   beginTime   =   System.currentTimeMillis();   
13                for(int   i   =   0;   i   <   10000;   i++)   
14                        text   =   text   +   i;   
15                long   endTime   =   System.currentTimeMillis();   
16                System.out.println("执行时间:"   +   (endTime   -   beginTime));   
17
18                StringBuilder   builder   =   new   StringBuilder("");   
19                beginTime   =   System.currentTimeMillis();   
20                for(int   i   =   0;   i   <   10000;   i++)   
21                        builder.append(String.valueOf(i));   
22                endTime   =   System.currentTimeMillis();   
23                System.out.println("执行时间:"   +   (endTime   -   beginTime));   
24        }
   
25}
   
26
27 在范例6.5中首先使用 + 来串联字符串,使用System.currentTimeMillis()取得for循环执行前、后的系统时间,这样就可以得知for循环执行了多久。以下是我的计算机上的测试数据:   
28
29 执行时间: 4641    
30 执行时间: 16    
31 可以看到执行的时间差距很大,这说明了使用 + 串联字符串所带来的负担。如果有经常作附加字符串的需求,建议使用StringBuilder。事实上就范例6.5来说,第二个for循环执行时间还可以更短,因为append()也可以接受基本数据类型,所以不必特地使用String.valueOf()方法从int取得String。改为以下的方式,执行时间可以大幅缩短:   
32 for ( int    i    =     0 ;   i    <     10000 ;   i ++ )   
33         builder.append(i);   
34 使用StringBuilder最后若要输出字符串结果,可以用toString()方法。可以使用length()方法得知目前对象中的字符长度,而capacity()可返回该对象目前可容纳的字符容量。另外,StringBuilder还有像insert()方法可以将字符插入指定的位置,如果该位置以后有字符,则将所有的字符往后移;deleteChar()方法可以删除指定位置的字符,而reserve()方法可以反转字符串。详细的使用可以查询java.lang.StringBuilder的API文件说明。   
35 StringBuilder是J2SE    5 .0才新增的类,在J2SE    5 .0之前的版本若有相同的需求,则使用java.lang.StringBuffer。事实上,StringBuilder被设计为与StringBuffer具有相同的操作接口。在单机非多线程(Multithread)的情况下使用StringBuilder会有较好的效率,因为StringBuilder没有处理同步(Synchronized)问题。StringBuffer则会处理同步问题,如果StringBuilder会在多线程下被操作,则要改用StringBuffer,让对象自行管理同步问题。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值