Java之中StringBuffer的作用

 要弄清楚Java之中的Buffer的作用,首先需要明白java之中Wrapper类型都是不可变的。什么是不可变类型呢?顾名思义,就是这种类型的对象一旦创建好之后,无论调用何种方法都无法改变该对象的任何的属性。你看看String类的源代码就会发现,它的所有的属性都是private final的,因此只有在构造String对象的时候,这些属性才是可以修改的。 String类的方法中需要返回一个String的,如substring,concat等,都会先构造一个新的String对象,然后返回,而原来的String对象是不会发生变化的。

    这样,如果需要用大量的小字符串拼接成一个长的字符串的时候,就会构造大量的中间的字符串。如下面的例子:

  1.     String [] arr1 = new String[10];
  2.     for (int i=0; i<arr1.length; i++)
  3.       arr1[i] = "Value" + i;
  4.     String result = "";
  5.     for(String s : arr1) {
  6.       result = result + s;
  7.     }
    最后一个循环执行的时候,就会生成大量的字符串临时对象: 

  1. Value0
  2. Value0Value1
  3. Value0Value1Value2
  4. Value0Value1Value2Value3
  5. ....
  6. Value0Value1Value2Value3Value4Value5Value6Value7Value8Value9
    这10个String对象之中,我们需要的只是最后的一个,前面的9个都会浪费内存。如果情况更糟的话,有几百个上千个,或者中间的字符串更长,浪费将会更加的严重。 StringBuffer就是为了解决这个问题。它是可变的,当修改或者追加字符串到原来的对象上是,不会新生成一个字符串,而是在原来的对象上进行修改。这样,就不用分配大量的空间给中间的临时对象了。 其他的Buffer也是类似的原理。 

    另外, StringBuffer类是线程安全的 ,在实现的时候会有大量的代码来处理同步,如果程序只是单线程的,这样会大大的降低执行的效率。这种情况下面应该考虑使用 StringBuilder ,它和StringBufer的方法完全一样,但不是线程安全的, 执行速度也更快。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值