使用 StringBuffer 主要就是在性能上的考虑。String 是一种非常常用的数据类型,但由于 String 是不可变对象,在进行 String 的相关操作的时候会产生许多临时的 String 对象。而 StringBuffer 在操作上是在一个缓冲中进行的,性能当然优越得多。不过,一般做为简单的字符串传递和其它操作,只不要改变字符串内容的操作,用 String 效率会高一些。

解决方案 »

  1.   

    2楼所得够清楚地了,细微的用法差别,察看API 就可以搞定!
      

  2.   

    先谢谢各位,我是想知道所谓的一个可变一个不可变,都是final的,变的是哪个部分啊?
      

  3.   

    这里的"可变"和"不可变",和是不是final没有关系举个例子:String str1 = "hello";
    String str2 = "world";
    String str1 = str1 + str2;//这里所做的内部操作,其实不是把str1的内容改变为原str1+str2的内容这么简单, 而把创建一个新的String, 内容为str1 + str2的内容,然后再把str1这个引用重新指向新创建的String, 这就是上面说的String不可变.而如果是StringBuffer的话,则直接更改str1的内容,而不是先创建一个新的StringBuffer
      

  4.   

    首先要搞清final关键字的含义:
    final可以用在数据、方法和类前。
    先说final用在数据前时,fianl如果用在基本数据前,则说明这个数据不能再被改变,如果用在一个对象(包括数组)的reference上,则说明这个reference不能再指向另一个reference(但是对象本身是可以被改变的)。
    再说final用在类前时,表明该类不能被继承,仅此而已,该类的数据成员能够改变要看他们前面是否有final。现在来看看String类的源码:
        private final char value[];
        private final int offset;
        private final int count;
    实际上String是用一个char数组来保存的,结合offset和count就代表了一个字符串,由于这三者都是final类型的,所以在初始化之后值就不能改变。(这里要说明的一点是:value是一个Object reference,不能再指向另一个char[],但是它本身的值是可以改变的,只不过String类没有提供改变的接口)再看看StringBuffer的源码:
        char value[];
    它继承自AbstractStringBuilder,值同样保存在一个char[]数组中,只是这个数组是可以改变的。这就是所谓String不可变,StringBuffer可变的根本原因。至于
    public final class String
    extends Object
    implements Serializable, Comparable, CharSequence

    public final class StringBuffer
    extends Object
    implements Serializable, CharSequence
    这两处的final只是说明这两个类不能被继承,跟类本身是否可变没有关系
      

  5.   

    StringBuffer 内容可以修改,final声明的是引用,引用地址无法改变,但是指向的内容可以改变。而String指向的内容是常数,不可改变。