求救:一个迷惑的问题 传进去前是ut,经过它之后就变成了"utsky",这时候就应该想到自己判断错误了啦,我是低手 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 >> 我是这样想的,因为sb1、sb2是本地变量,那么就是按值传递,传递的是sb1、sb2的一份copy.sb1, sb2都是对象,不是值传递,是引用, 我想问的问题是:为什么swap方法交换不了sb1、sb2的值?而在方法里面可以交换? 如果方法的参数是int,char,long等简单类型,则传递的是值得拷贝。如果方法的参数是对象类型,传递的是引用的拷贝。private static void swap(StringBuffer s1,StringBuffer s2)中的参数s1,s2是变量sb1,sb2的引用拷贝,即指向同一个对象。 如果方法的参数是int,char,long等简单类型,则传递的是值得拷贝。如果方法的参数是对象类型,传递的是引用的拷贝。private static void swap(StringBuffer s1,StringBuffer s2)中的参数s1,s2是变量sb1,sb2的引用拷贝,即指向同一个对象。这是jackxing(Jack) 的解释,我认为是正确的。至于楼主问的:既然是按值传递,传递的就是本地的一份copy,那么为什么里面的append()方法又传回改变后的值了?因为你用的是stringbuffer,StringBuffer对象是可以修改的字符串。所以,它调用append()方法时,不用重新分配内存,也就是它直接在先前的内存空间里进行修改。所以值会变。 如果你用String 就可以看到不同的结果,可以试下。这就是StringBuffer与String 的不同。 还是没人答到点上首先,先确定一点:传引用是没错的。这也是为什么append()的时候可以更新到地址上的值的原故;但问题是在交换之后,返回主函数之前,值是交换的了,但返回后为什么没有交换???期待~~~继续关注! ft!这样来理解吧,就这道题而言:假设:sb1 ->35(此数字代表内存地址) sb2 ->36调用swap()方法后,把sb1的值附给s1,把sb2的值附给s2。也就是说,s1->35,s2->36。但是注意此时sb1 ->35,sb2 ->36这是不变的。然后在swap()方法里,s1.append()来拼接一个字符串,注意上StringBuffer,所以在原内存地址里面做修改,而不重新分配内存。所以35内存存储的内容发生变化。然后s1,s2做交换,只是把s1,s2的指向改变,也就是引用改变,跟内存中存储的内容无关,同时,s1,s2也与sb1,sb2无关。改变后s1->36,s2->35。而sb1 ->35,sb2 ->36。 呵呵 楼上说的还是不对改成String结果也是一样 只不过有些稍微变化还是没交换过来. 你误会我的意思了,改成String 以后,输出结果肯定不一样,但是交换还是不会交换,上面说的很清楚了。StringBuffer 改成String后,swap()里的append(),当然要改成+=了,对sb1就不起作用,也就说,sb1的输出将不会有sky。前面一条输出会有的,也就是swap()方法会把这个拼接上去,因为你用+=的话,相当于new了一个字符串我只能说那么多了,如果还不理解,偶也没办法了....... 顶一个,楼主,flyineagle(逆风飞扬)说得非常清楚了 flyineagle(逆风飞扬)说得非常清楚了另String类型有点特殊,String的内容是存在一个叫对象池中的。 StringBuffer对象是可以修改的字符串。它调用append()方法时,不重新分配内存,直接在先前的内存空间里进行修改。所以会出现swep中的StringBuffer.append改变引用本来的值。导致最后的sb1为utsky 关于JSP页取值的问题。 实在不明白跳转失败,servlet,初学者 刷新页面后保留查询条件 Tomca服务器怎样修改和添加任务计划 struts中的中文处理 ejb2.0 sessionBean调用cmp实体bean出现的奇怪问题 webwork关于radio标签的应用 Spring的InvalidDataAccessApiUsageException异常 如何在JTable中彻底删除一列?? StringBuffer append 报错 update时有问题 java的执行方式是什么(每分了,大家帮个忙)
为什么swap方法交换不了sb1、sb2的值?
而在方法里面可以交换?
如果方法的参数是对象类型,传递的是引用的拷贝。private static void swap(StringBuffer s1,StringBuffer s2)
中的参数s1,s2是变量sb1,sb2的引用拷贝,即指向同一个对象。
如果方法的参数是对象类型,传递的是引用的拷贝。private static void swap(StringBuffer s1,StringBuffer s2)
中的参数s1,s2是变量sb1,sb2的引用拷贝,即指向同一个对象。这是jackxing(Jack) 的解释,我认为是正确的。
至于楼主问的:既然是按值传递,传递的就是本地的一份copy,那么为什么里面的append()方法又传回改变后的值了?
因为你用的是stringbuffer,StringBuffer对象是可以修改的字符串。所以,它调用append()方法时,不用重新分配内存,也就是它直接在先前的内存空间里进行修改。所以值会变。
但问题是在交换之后,返回主函数之前,值是交换的了,但返回后为什么没有交换???
期待~~~继续关注!
假设:sb1 ->35(此数字代表内存地址)
sb2 ->36
调用swap()方法后,把sb1的值附给s1,把sb2的值附给s2。
也就是说,s1->35,s2->36。但是注意此时sb1 ->35,sb2 ->36这是不变的。
然后在swap()方法里,s1.append()来拼接一个字符串,注意上StringBuffer,所以在原内存地址里面做修改,而不重新分配内存。所以35内存存储的内容发生变化。
然后s1,s2做交换,只是把s1,s2的指向改变,也就是引用改变,跟内存中存储的内容无关,同时,s1,s2也与sb1,sb2无关。改变后s1->36,s2->35。而sb1 ->35,sb2 ->36。
改成String结果也是一样 只不过有些稍微变化
还是没交换过来.
我只能说那么多了,如果还不理解,偶也没办法了.......
它调用append()方法时,不重新分配内存,直接在先前的内存空间里进行修改。
所以会出现swep中的StringBuffer.append改变引用本来的值。导致最后的sb1为utsky