日期:2014-05-20  浏览次数:20763 次

StringBuffer&StringBuilder不可变?
大家都说String不可变的原因是因为JDK源码中String类声明为final的原因.
那么我有一个问题:
既然String类声明为fianl就不可变.
那么StringBuffer类和StringBuilder也是被声明为final的.为什么他俩又可以变呢?

------解决方案--------------------
大家都说String不可变的原因是因为JDK源码中String类声明为final的原因.
-----------------------------------------
final保证的只是不可被继承而已。
String那特殊而变态的不变是String自己的实现造成的:
StringBuffer和StringBuilder有append之类改变自己的方法,String所有改变自己的方法其实都new出了新类( ̄(工) ̄)
------解决方案--------------------
关于String的不可改变的分析,以及与StringBuilder的区别。

理解错误,String不可变是因为
1 类自身是final的
2 类里面的内容也是final的。比如最重要的保存字符串的部分
 private final char value[];

而StringBuilder呢?
public StringBuilder() {
super(16);
}
在 AbstractStringBuilder 里面是
 char value[];
 AbstractStringBuilder(int capacity) {
value = new char[capacity];
 }

可见,这个char是可以变化的。通过一个 expandCapacity的方法进行扩充容量。
这就是区别