菜鸟问题 Sting和StingBuffer

linhui9010 2009-07-20 11:29:49


public class test {
public static void main(String []args) {
String s="java";
StringBuffer buffer=new StringBuffer(s);
change(s,buffer);
System.out.println(s);
System.out.println(buffer);
}
private static void change(String s,StringBuffer buffer){
s=s+" and html";
buffer.append(" and html");
}
}
为什么s的值还是java而不是java and html ,是因为String类的值不能改动吗?谢谢了
...全文
264 24 打赏 收藏 转发到动态 举报
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
wangjiancy 2009-07-21
  • 打赏
  • 举报
回复
这个就是个值传递和引用传递的事。跟交换两个数有一拼,
交换两个数,要是把值传过去,也不会改变,但是要传两个应用过去
就可以交换两个数了。
reeves101 2009-07-21
  • 打赏
  • 举报
回复
Mark
jxst051665 2009-07-21
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 nzz1985 的回复:]
貌似4楼都是值传递不对吧,只有基本数据类型和String是值传递啊,其他的是引用传递,
像buffer,将同一个对象的新的引用传递过去,所以对象是不会改变的,只是内容被改变了
StringBuffer buffer=new StringBuffer(s);
  change(s,buffer);
  这里的2个引用buffer是不相同的
[/Quote]
tfsict2008 2009-07-21
  • 打赏
  • 举报
回复
多看点基础的东西吧
zhuzhusany 2009-07-20
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 bigbug9002 的回复:]
不是因为String不能改动,而是java中的参数传递都是值传递。

你在change方法中,对s这个参数做了改变,这种改变不会带回到调用方法(main)。

...
[/Quote]
的确java中的参数传递都是值传递,对象作为参数的时候也不会改变它的指向,但是改变对象的内部状态是可以的,buffer作为参数传递是可以改变它的值的
sheriguan 2009-07-20
  • 打赏
  • 举报
回复
在java中,没有地址传递这个概念,所有的都是值传递
你的这个
s=s+" and html";
只是改变了这个方法里的s而没有改变实例变量中的s,它们是两个概念
你试试这个
this.s = s+" and html";
bigbug9002 2009-07-20
  • 打赏
  • 举报
回复
参数如果是基本类型,是把实参的值传给了形参.
参数如果是引用类型(也就是非基本类型),是把实参的引用的值传给了形参.传递的还是值,只不过这个值是引用.

String做参数,传过去的,也是引用的值.和其它引用做参数一样,没有什么不同.
nzz1985 2009-07-20
  • 打赏
  • 举报
回复
晕死,出了504错误也能提交啊
nzz1985 2009-07-20
  • 打赏
  • 举报
回复
貌似4楼都是值传递不对吧,只有基本数据类型和String是值传递啊,其他的是引用传递,
像buffer,将同一个对象的新的引用传递过去,所以对象是不会改变的,只是内容被改变了
StringBuffer buffer=new StringBuffer(s);
change(s,buffer);
这里的2个引用buffer是不相同的,只是所指对象一样
nzz1985 2009-07-20
  • 打赏
  • 举报
回复
貌似4楼都是值传递不对吧,只有基本数据类型和String是值传递啊,其他的是引用传递,
像buffer,将同一个对象的新的引用传递过去,所以对象是不会改变的,只是内容被改变了
StringBuffer buffer=new StringBuffer(s);
change(s,buffer);
这里的2个引用buffer是不相同的
qiubojuncode 2009-07-20
  • 打赏
  • 举报
回复
向4楼学习
qiubojuncode 2009-07-20
  • 打赏
  • 举报
回复
向4楼学习
bigbug9002 2009-07-20
  • 打赏
  • 举报
回复
不是因为String不能改动,而是java中的参数传递都是值传递。

你在change方法中,对s这个参数做了改变,这种改变不会带回到调用方法(main)。

比如,你把程序改为:
private static void change(String s,StringBuffer buffer){ 
s=s+" and html";
StringBuffer sb=new StringBuffer();
sb.append(buffer);
sb.append(" and html");
buffer=sb;
}


同样的,main方法中的buffer值也是不会改变的。道理是一样的。

这里还有一个问题,如果形参是String,能不能在方法中通过这个形参,对其内容做修改呢?答案是不能。
因为String类的方法中,如果对内容做了改变,结果一定是用新的引用指向。这可能就是String叫不可变字符串的原因。
kojie_chen 2009-07-20
  • 打赏
  • 举报
回复
恩,string 是常量字符串,不能改变其内容
kojie_chen 2009-07-20
  • 打赏
  • 举报
回复
恩,string 是常量字符串,不能改变其内容
designedIt 2009-07-20
  • 打赏
  • 举报
回复
是啊。String类的值不能改动啊。
ouyangyh 2009-07-20
  • 打赏
  • 举报
回复
String 虽然也是一种引用类型
但它在JAVA中已经作了特殊处理
每次改变它的值是,JVM就会自动生成一个新的String对象
也就是地址就会不同了
正因为这个,在对String对象进行很多次的连接(+)操作时
String性能就会大打折扣
从而StringBuffer就出现了
以提高这方面的性能
closewbq 2009-07-20
  • 打赏
  • 举报
回复
在c#中是可以这样的,你只要传递参数的时候采用ref 引用。但是java没有ref这个关键字,也没有这个用法。
LZ的做法和String类型没有什么关系,就是传别的值也一样,因为参数传递是值传递。
lasfrost 2009-07-20
  • 打赏
  • 举报
回复
4楼正解,你们1楼2楼的全错,这跟String可不可变没关系。
在java里所有的方法调用都是值传递,此帖子中的是String的引用的值的传递,意味着change方法中的s只是main中s的一个副本。
“String是不可变”这句话应该这么理解:
1.String是final类,不能够继承。
2.String中没有相关方法可以改变String内部的字符序列。
Color,Font之类的类和String一样都是“不可变的”。
For_suzhen 2009-07-20
  • 打赏
  • 举报
回复
http://hi.baidu.com/%C5%DD%B0%C9%BA%C8%BE%C6/blog/item/eb140a39c9cd70f5b211c7bb.html
看看这个分析
加载更多回复(4)
内容概要:本文聚焦2026年高教社杯全国大学生数学建模竞赛B题“无线电干扰源的快速自动定位与清除”,提供涵盖数学建模、算法实现与论文撰写的全套技术支持,并扩展分享多个科研方向的Matlab/Simulink仿真项目,如无人机协同路径规划、电力系统无功优化、信号处理、图像处理、车间调度、新能源预测与优化调度等。资源内容不仅服务于竞赛备赛,还覆盖智能优化、通信定位、边缘计算、雷达追踪、深度学习等多个前沿科研领域,旨在为参赛学生与初级科研人员提供系统化、高质量的技术参考与资源共享。文中强调科研需逻辑严密、善于借力,并倡导按目录系统学习以提升建模能力与科研素养,所有资料可通过指定网盘链接或微信公众号免费获取。; 适合人群:全国大学生数学建模竞赛参赛者,具备Matlab编程与数学建模基础的本科及研究生,以及从事智能优化、信号处理、电力系统、路径规划、机器学习等方向的初级科研人员。; 使用场景及目标:①备战数学建模竞赛,快速掌握赛题解题思路、算法模型与论文写作模板;②开展科研项目时复现经典算法、借鉴成熟仿真方法,提升研究效率;③系统学习多领域(如无人机路径规划、微电网优化、光伏/风电预测、图像处理)的Matlab/Simulink实现技术。; 阅读建议:建议读者按照资源目录顺序系统浏览,结合网盘中的代码与文档进行实践操作,重点关注建模逻辑、算法实现细节与仿真结果分析,同时关注公众号与共享链接以获取完整资料,全面提升竞赛竞争力与科研实践能力。
下载代码方式:https://pan.quark.cn/s/0636d5a2cd63 爱普生1390型宽幅照片打印机是一款备受摄影发烧友及小型设计机构欢迎的经典设备。经过一段时间的持续运作,其供纸辊可能会遭遇磨损或积聚灰尘,进而干扰打印机的正常运作,例如在打印过程中出现纸张移动或卡住等情况。本指南将系统性地阐述对爱普生1390进行拆解并更换供纸辊的具体操作方法。 1. **前期准备** 在着手拆解之前,务必要将打印机关闭并切断电源供应。需要准备一套适配的小型螺丝刀及辅助工具,同时备齐全新的供纸辊。采购供纸辊时,必须核实其与爱普生1390型号完全兼容。 2. **外部拆解** 开始移除打印机的外壳部件。通常情况下,这涉及到松开底部和背面的固定螺栓。在分离外壳时需格外谨慎,以免拉扯到机内部署的电线或线缆。 3. **曝露供纸部件** 继续对内部结构进行拆解,直至定位到供纸辊组件。这个过程可能需要取下墨盒托架、进纸模块等零件。务必记住各个部件的原始位置和朝向,以便后续顺利复原。 4. **拆卸供纸辊** 供纸辊一般通过轴心固定于打印机内部。借助螺丝刀或其他适宜工具松开固定轴,随后轻轻转动或抽离供纸辊。操作过程中需留意避免损伤周边的塑料构件。 5. **清洁或调换供纸辊** 若供纸辊仅因污损,可用柔软布料蘸取少量酒精进行轻柔擦拭,以去除附着物和尘埃。倘若供纸辊已出现损耗,则必须更换为新的。新供纸辊应依照原样安装,确保轴心与齿轮系统精确对接。 6. **重新组装** 依照与拆解相反的顺序,小心地将各个部件逐一装回,确保每部分都准确对齐并牢固固定。特别要注意连接线缆,防止其发生扭曲或过度弯曲。 7. **功能测试** 组装完毕后,重新接入电源,启动打印机,检验其是否能正常...

62,621

社区成员

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

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