关于StringBuffer的问题。

cjhuaxin 2012-07-25 05:25:06
public class StringBufferTest{
public static void main(String args[]){
StringBuffer sb1 = new StringBuffer("One");
StringBuffer sb2 = new StringBuffer("Two");
swap(sb1,sb2);
System.out.println("sb1:"+sb1);
System.out.println("sb2:"+sb2);
}
public static void swap(StringBuffer a,StringBuffer b){
a.append(" More");
b = a;
}
}
以上代码为什么为什么输出是sb1:One More sb2:Two啊,有点费解,希望高手帮小弟解答一些,万分感谢!
...全文
217 13 打赏 收藏 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
雾里岚田 2012-08-14
  • 打赏
  • 举报
回复
内存分析图太小了,看这个地址:http://img.my.csdn.net/uploads/201208/14/1344942600_7068.jpg
不好意思有点罗嗦了。
雾里岚田 2012-08-14
  • 打赏
  • 举报
回复
图片补充:
内存分析情况图如下:

doc下的运行结果如下图:
雾里岚田 2012-08-14
  • 打赏
  • 举报
回复
针对楼主的问题如下:
内存分析情况图如下(若有错请高手指点):


代码如下(如楼主差不多的):
public class Test{
public static void main(String[] argv){
StringBuffer a=new StringBuffer("one");
StringBuffer b=new StringBuffer("two");
Test.swap(a,b);

System.out.println("Main方法中的值:\na is"+a+"\nb is"+b);


}
static void swap(StringBuffer a,StringBuffer b){
a.append(" more");
b=a;
System.out.println("swap方法中的值:\na is"+a+"\nb is"+b);
}
}
doc下的运行结果如下图:

cjhuaxin 2012-07-25
  • 打赏
  • 举报
回复
小弟终于弄明白你了,感谢大家的解答!!
zhoujiping1234 2012-07-25
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 的回复:]

StringBuffer sb1 = new StringBuffer("One");
StringBuffer sb2 = new StringBuffer("Two");
上面两句创建了两个StringBuffer对象,并且让sb1和sb2分别指向这两个对象,可以理解为它们指向了对象的地址,它们只是引用变量而已。
swap里面,传入的是引用,a和b也是两个引用。一开始a和sb1都指向了……
[/Quote]

同意此观点
hllfl 2012-07-25
  • 打赏
  • 举报
回复
内存中对象没改变
wwwcomcn123 2012-07-25
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 的回复:]
StringBuffer sb1 = new StringBuffer("One");
StringBuffer sb2 = new StringBuffer("Two");
上面两句创建了两个StringBuffer对象,并且让sb1和sb2分别指向这两个对象,可以理解为它们指向了对象的地址,它们只是引用变量而已。
swap里面,传入的是引用,a和b也是两个引用。一开始a和sb1都指向了对象“one”,b和sb2都指向对象“two”。然后a.append(" More")改变了a指向的对象的内容,而b=a这个完全没关系啊,它只是让b也指向“one”而已,并不能真正改变“two”的内容,也对sb2没有影响。所以System.out.println("sb2:"+sb2)打印的仍然是对象“two”。
[/Quote]

b此时应该指向oneMore了吧
csdpz 2012-07-25
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]
引用 2 楼 的回复:
引用 1 楼 的回复:
首先你传到swap函数中的是两个引用 a指向sb1 b指向sb2;a.append(" More");所以a指向One More。因为传的是引用类型所以sb1指向的也是他。后面把a的值赋给b,那就是让b指向a,他并不影响sb2。(前一个是对是对传过来的地址中的内容进行了一些操作,后一个并没有对其 操作所以原样输出)。(个人理解不好请大家指出)
……
[/Quote]
嗯,按照传引用来理解~可以解释的通。我理解了
书断华 2012-07-25
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]
引用 1 楼 的回复:
首先你传到swap函数中的是两个引用 a指向sb1 b指向sb2;a.append(" More");所以a指向One More。因为传的是引用类型所以sb1指向的也是他。后面把a的值赋给b,那就是让b指向a,他并不影响sb2。(前一个是对是对传过来的地址中的内容进行了一些操作,后一个并没有对其 操作所以原样输出)。(个人理解不好请大家指出)


can't u……
[/Quote]好吧看来我的能力还很烂,表述估计也有问题。我的意思是最主要的是因为swap函数对sb1指向的那个对象做了一些操作,而没有对sb2指向的那个对象做任何操作!不知道这么说对不对、、、
zcjiehubeilove 2012-07-25
  • 打赏
  • 举报
回复
StringBuffer sb1 = new StringBuffer("One");
StringBuffer sb2 = new StringBuffer("Two");
上面两句创建了两个StringBuffer对象,并且让sb1和sb2分别指向这两个对象,可以理解为它们指向了对象的地址,它们只是引用变量而已。
swap里面,传入的是引用,a和b也是两个引用。一开始a和sb1都指向了对象“one”,b和sb2都指向对象“two”。然后a.append(" More")改变了a指向的对象的内容,而b=a这个完全没关系啊,它只是让b也指向“one”而已,并不能真正改变“two”的内容,也对sb2没有影响。所以System.out.println("sb2:"+sb2)打印的仍然是对象“two”。
wwwcomcn123 2012-07-25
  • 打赏
  • 举报
回复
同意1楼
sb2指向内存“Two” 而b指向sb2
当b = a;
b指向a 则b为One More
但sb2还是指向内存“Two”的。

同样个人理解 仅供参考
jason_deng 2012-07-25
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]
首先你传到swap函数中的是两个引用 a指向sb1 b指向sb2;a.append(" More");所以a指向One More。因为传的是引用类型所以sb1指向的也是他。后面把a的值赋给b,那就是让b指向a,他并不影响sb2。(前一个是对是对传过来的地址中的内容进行了一些操作,后一个并没有对其 操作所以原样输出)。(个人理解不好请大家指出)
[/Quote]

can't understand what you mean
书断华 2012-07-25
  • 打赏
  • 举报
回复
首先你传到swap函数中的是两个引用 a指向sb1 b指向sb2;a.append(" More");所以a指向One More。因为传的是引用类型所以sb1指向的也是他。后面把a的值赋给b,那就是让b指向a,他并不影响sb2。(前一个是对是对传过来的地址中的内容进行了一些操作,后一个并没有对其 操作所以原样输出)。(个人理解不好请大家指出)
内容概要:本文围绕通过短时倒谱(Cepstrogram)计算进行时-倒频分析的研究,提出了一种基于Matlab的信号处理方法,旨在从复杂信号中提取时变的倒频域特征,尤其适用于具有非线性反馈的LTI系统识别。文中系统阐述了短时倒谱的理论基础、计算流程与实现机制,并结合Simulink与Matlab代码实现了多个典型应用案例,涵盖非线性系统辨识、路径损耗建模、信号去噪与增强等,充分展示了该方法在系统建模与信号分析中的强大能力。研究不仅提供了完整的算法实现方案,还深入探讨了其在科研与工程实践中的广泛应用前景。; 适合人群:具备扎实的信号处理理论基础与Matlab编程能力,从事自动化、通信工程、电子工程、控制科学等领域的高校研究生、科研人员及工程技术人员。; 使用场景及目标:①实现对具有非线性反馈的LTI系统的精确建模与参数辨识,提升系统识别的准确性与鲁棒性;②在强噪声背景下进行有效的信号特征提取与时-倒频域分析,恢复信号的有效成分;③作为高级信号处理的教学与科研平台,帮助深入理解倒谱分析的物理意义及其在现代工程中的实际应用。; 阅读建议:建议读者在学习过程中紧密结合文中提供的Matlab代码与Simulink模型进行动手实践,通过调整参数、修改输入信号等方式观察分析结果的变化,以加深对算法机理的理解;同时可访问作者提供的网盘资源与完整代码包,系统性地掌握相关技术的优化与拓展方法。

62,620

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧