使用 StringBuffer 主要就是在性能上的考虑。String 是一种非常常用的数据类型,但由于 String 是不可变对象,在进行 String 的相关操作的时候会产生许多临时的 String 对象。而 StringBuffer 在操作上是在一个缓冲中进行的,性能当然优越得多。不过,一般做为简单的字符串传递和其它操作,只不要改变字符串内容的操作,用 String 效率会高一些。
调试欢乐多
String str2 = "world";
String str1 = str1 + str2;//这里所做的内部操作,其实不是把str1的内容改变为原str1+str2的内容这么简单, 而把创建一个新的String, 内容为str1 + str2的内容,然后再把str1这个引用重新指向新创建的String, 这就是上面说的String不可变.而如果是StringBuffer的话,则直接更改str1的内容,而不是先创建一个新的StringBuffer
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只是说明这两个类不能被继承,跟类本身是否可变没有关系