菜鸟问题 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类的值不能改动吗?谢谢了
...全文
266 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)
内容概要:本文提出了一种基于混沌系统与DNA编码的复合型彩色数字图像加密方案,旨在解决传统加密算法密钥空间小、抗干扰能力弱的问题。该方案利用混沌系统生成伪随机序列,结合DNA碱基编码规则对图像RGB三通道进行像素级置换与混淆扩散,实现高安全性加密;解密过程则通过逆操作精确还原原始图像。文章重点对该方案进行了系统的抗噪声与抗裁剪性能分析,实验结果表明,该算法在面对高斯噪声、椒盐噪声以及不同面积、位置的裁剪攻击时均表现出优良的鲁棒性,能够有效恢复图像核心信息,适用于网络传输与私密存储等复杂环境下的图像安全保护。; 适合人群:具备一定信号处理或信息安全基础知识,从事图像加密、信息隐藏、多媒体安全等相关领域的科研人员及研究生。; 使用场景及目标:①用于提升数字图像在网络传输中的安全性,防止窃听与篡改;②适用于医疗影像、军事测绘、商业机密等对图像安全性和抗干扰性要求较高的应用场景;③为研究高鲁棒性图像加密技术提供理论支持与实验参考。; 阅读建议:建议读者结合Matlab代码实践加密与解密流程,并自行设计不同强度的噪声与裁剪干扰实验,深入理解混沌置乱与DNA编码在提升算法鲁棒性方面的协同机制。

62,620

社区成员

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

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