StringBuilder StringBuffer and "+"

String字符串是Java中最常用的数据结构.
"+"在Java中已被String类重载.所以我们常见是用"+"来连接字符串.
如:

String test = " the first number is " + 0;

在JDK5.0以后还提供一个类StringBuilder(JDK1.4中只提供了StringBuffer),它也可以提供类似"+"的功能.
[StringBuilder和StringBuffer的区别是前者是线程不安全的,后者是线程安全的,所以从效率上来说前者要比后者高]
StringBuilder一般使用在方法内部来完成类似"+"功能,因为是线程不安全的,所以用完以后可以丢弃.StringBuffer要用在全局变量中,
上面我们讨论了两者的区别.下面我们来比较StringBuilder和"+"的效率区别...
如果一个简单的字符串的拼接,应该说StringBuilder和"+"的效率是差不多的,因为在JVM编译过程中,它首先就是将"+"编译成StringBuilder的引用来append.

public static void main(String[] args){
String result = " hello" + "javaeye"+" " + 1234567890;
System.out.println(result);
}

编译完后我们用Jad反编译/.class后我们可以看到所有的"+"号全被StringBuilder代替.

String result = (new StringBuiler("hello")).append("javaeye").append(" ").append(1234567890).toString();

所以我们说在这种情况下使用"+"和使用StringBuiler效率差不多.我们可以得出结论,在Java中无论使用何种方式进行字符串连接,实际上都使用的是StringBuilder。

但在for循环中我们再来测试一下二者的效率.

String result = "";
Random r = new Random();
for(int i=0; i< 10;i++){
result = result + r.nextInt(1000)+ "";
}
System.out.println(result);

此时我们会看到如下的情形:

result = (new StringBuiler(String.valueOf(result))).append(r.nextInt(1000)).append(" ").toString();


虽然编译器将"+"转换成了StringBuilder,但创建StringBuilder对象的位置却在for语句内部。这就意味着每执行一次循环,就会创建一个StringBuilder对象(对于本例来说,是创建了10个StringBuilder对象),虽然Java有垃圾回收器,但这个回收器的工作时间是不定的。如果不断产生这样的垃圾,那么仍然会占用大量的资源。解决这个问题的方法就是在程序中直接使用StringBuilder来连接字符串,代码如下:

String result = "";
Random r = new Random();
StringBuilder sb = new StringBuilder();
for(int i=0; i<10 ; i++){
sb.append(r.nextInt(1000));
sb.append("");
}
result = sb.toString();
System.out.println(result);


此外在循环中也不要和StringBuiler混用"+"号;以上代码在JDK5.0下测试通过.如果是JDK1.4,则将StringBuilder替换为StringBuffer().
总结:
如果在循环中尽量少用new对象来创建对象,这样会导致大量对象的创建,类似的地方还有:
伪代码

int length = xxxList.size();
for(int i=0;i<length;i++}{......}
//和将得到length放到循环里取的性能就不一样
for(int i=0;i<xxxList.size();i++){......}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值