java 对象发生 改变

来源:百度知道 编辑:UC知道 时间:2024/05/10 22:43:12
今天看StringBuffer类有个疑问
如:
StringBuffer sb = new StringBuffer("aaa");
StringBuffer sb2 = sb.append("bbb");
对StringBuffer的操作是不是导致了它(引用sb)指向的对象在缓冲区发生了改变?我的意思就是导致了AbstractStringBuilder的那个char value[]发生了改变
还是说像String一样,是引用的指向发生了改变?

大家所说的对象发生改变是不是就是指一个对象的引用变量的指向发生了改变?

StringBuffer和String最大的不同就是对象的改变问题,当用new创建对象时,StringBuffer的对象是放在字符串缓冲区中的,用append方法可以直接改变开辟的空间里的内容。而String的改变是引用的改变。
也就是说当StringBuffer只开辟一次空间,再怎麽变也是当前空间内容的改变。而String可能要开辟好几次空间,而引用只是指向变化后的那个空间地址。

如果是引用发生了改变,那就是生成了新的对象,怎么能说是对象发生了改变呢。

我举例子说明。
String 是不可变类,Stringbuffer是可变类 你应该知道吧

String str="aa"; str="bb";
这里str本来是指向一个字符串aa ,后来又指向了另一个字符串bb。

aa和bb是两个不一样的字符串。

而StringBuffer提供了可以改变自身状态的方法,就是append。

StringBuffered sb=new StringBuffered("aa");

sb.append("bb");

然后sb的内容就是aabb了, 指向并没有变,而是内容变了。

String 类并没有提供可以改变自身状态的方法,他的所有方法都是重新new一个对象,然后让引用指向新对象。

谢谢

跟String不一样,就是指向的对象在缓冲区发生了改变