JAVA StringBuffer的赋值问题,求高人答复。

publicclassTest{publicstaticvoidmain(String[]args){StringBuffersb=newStringBuffer();s... public class Test {
public static void main(String[] args) {
StringBuffer sb = new StringBuffer();
sb.append("1111111111111111111122");
System.out.println("sb11="+sb);
StringBuffer sc = new StringBuffer();
sc=sb;
sc = sc.delete(0,sc.length()-1);
System.out.println("sb="+sb);
}
}

明明没有对sb进行操作,为什么最后打印出来是
sb11=1111111111111111111122

sb=2
展开
 我来答
yy_baduba
推荐于2017-11-24 · TA获得超过348个赞
知道答主
回答量:82
采纳率:100%
帮助的人:135万
展开全部
以下下都是我个人根据我所知道的知识做的一个分析:
首先,要想分析这个原因必须要知道:
Java中的变量只是一个引用,存储在栈空间,栈里存储的只是指向对空间一个对象的地址如;
通过new关键字创建的对象存储在对空间;

下面我们进入正题:
上边代码中StringBuffer sb = new StringBuffer();
sb.append("1111111111111111111122");
sb是存储在栈空间里的一个指向堆空间的一个地址;堆的值就是1111111111111111111122;
StringBuffer sc = new StringBuffer();
sc同sb,只是sc指向的一个新创建的一个对象;
当执行sc=sb;后,sc的地址与sb的地址相同指向之前sb所指向的对象,对象的值也就是1111111111111111111122;
咱们平时操作变量都是操作它引用的对象;所以执行sc = sc.delete(0,sc.length()-1);后,sc指向的对象的值就变为2;因为sb和sc指向的同一个堆空间里得对象,所有sb输出的值也就是2;

如有不同意见或建议请指教,或加入本人Java技术交流群81753923共同探讨!谢谢
lylegend13
2011-10-27 · TA获得超过4696个赞
知道大有可为答主
回答量:1701
采纳率:0%
帮助的人:1731万
展开全部
StringBuffer buffer=new StringBuffer("string"):
用这样的方式
————————————————————————————————————————
你好,你这个的问题,问到了StringBuffer这个类的精华, StringBuffer sb = new StringBuffer();,这里的sb其实是一个引用,sb.append("1111111111111111111122");,sb指向"1111111111111111111122"。

sc=sb;这一句执行后,sc也指向了sb本来指向的“1111111111111111111122”

于是对sc的一系列操作,其实就是对“1111111111111111111122”的操作

所以最后的结果就是sb变化了,虽然是通过sb指向对象的另一个引用sc来处理的
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
温静波好
2011-10-27 · TA获得超过117个赞
知道答主
回答量:192
采纳率:0%
帮助的人:119万
展开全部
我把你这个程序放到eclipse,有错误的,sc = sc.substring(0,sc.length()-1);
追问
sc = sc.delete(0,sc.length()-1);
应该是这样
追答
我和同学一起看了也上网查了查,总之就是String是不可变的,StringBuffer是可变的,这是网上找得程序,呵呵,
public class Untitled1 {
public Untitled1() {
}
public static void main(String[] args) {
Untitled1 untitled11 = new Untitled1();
String s1="STRING类的值是不是会变的->";
String s2=s1;
System.out.println(s2);
s1+="加个试试"; //String 赋值实际上这个是NEW了一个新的对象了,S1变了
System.out.println(s2); //S2没有变,这是因为S2指向的地址还是最早的s1所在的地址

StringBuffer b1=new StringBuffer("StringBuffer类的值是会变的->");
StringBuffer b2=b1;
b2.append("加个试试");//StringBuffer赋值,操作b2还是那个对象,
System.out.println(b1);//所以加一个字符进去b1指向的对象的值已经变了哦
}
}

结果:
STRING类的值是不是会变的->
STRING类的值是不是会变的->
StringBuffer类的值是会变的->加个试试

感觉就是用string时,相当于new 了一个s2,用StringBuffer时,b1和b2是一个!
这是API:

public StringBuffer append(StringBuffer sb) 将指定的 StringBuffer 追加到此序列中。
按顺序将 StringBuffer 参数中的字符追加到此 StringBuffer 中,并使 StringBuffer 在长度上增加该参数的长度。如果 sb 为 null,则将 4 个 "null" 字符追加到此 StringBuffer 中。

在执行 append 方法前,让 StringBuffer 中包含的原有字符序列的长度为 n。如果 k 小于 n,则新字符序列中索引 k 处的字符等于原有字符序列中索引 k 处的字符;否则它等于参数 sb 中索引 k-n 处的字符。

该方法在 this(目标)对象上实现同步,但不在源(sb)上实现同步。
不知道能不能帮你!
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
三只熊47
2011-10-27 · TA获得超过125个赞
知道答主
回答量:82
采纳率:0%
帮助的人:44.6万
展开全部
public class Test {
public static void main(String[] args) {
StringBuffer sb = new StringBuffer();
//对sb进行连接sb所指的栈内存的内容为"1111111111111111111122"
sb.append("1111111111111111111122");
System.out.println("sb11="+sb);
StringBuffer sc = new StringBuffer();
sc=sb;//关键问题在这里,把sb指向的栈内存的首地址传递给sc,所以sc和sb指向栈内存中的同一片存储空间
sc = sc.delete(0,sc.length()-1);//这里虽然对sc操作,却对sb和sc所指向的公共栈内存做了修改,所以sb也变了
System.out.println("sb="+sb);
}
}
如果你想你想把sb指向的栈内存中的内容放到sc只指向的另一片栈内存的话,用这个函数arraycopy()
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式