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类的值不能改动吗?谢谢了
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类的值不能改动吗?谢谢了
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叫不可变字符串的原因。
像buffer,将同一个对象的新的引用传递过去,所以对象是不会改变的,只是内容被改变了
StringBuffer buffer=new StringBuffer(s);
change(s,buffer);
这里的2个引用buffer是不相同的
像buffer,将同一个对象的新的引用传递过去,所以对象是不会改变的,只是内容被改变了
StringBuffer buffer=new StringBuffer(s);
change(s,buffer);
这里的2个引用buffer是不相同的,只是所指对象一样
参数如果是引用类型(也就是非基本类型),是把实参的引用的值传给了形参.传递的还是值,只不过这个值是引用.String做参数,传过去的,也是引用的值.和其它引用做参数一样,没有什么不同.
你的这个
s=s+" and html";
只是改变了这个方法里的s而没有改变实例变量中的s,它们是两个概念
你试试这个
this.s = s+" and html";
看看这个分析
在java里所有的方法调用都是值传递,此帖子中的是String的引用的值的传递,意味着change方法中的s只是main中s的一个副本。
“String是不可变”这句话应该这么理解:
1.String是final类,不能够继承。
2.String中没有相关方法可以改变String内部的字符序列。
Color,Font之类的类和String一样都是“不可变的”。
LZ的做法和String类型没有什么关系,就是传别的值也一样,因为参数传递是值传递。
但它在JAVA中已经作了特殊处理
每次改变它的值是,JVM就会自动生成一个新的String对象
也就是地址就会不同了
正因为这个,在对String对象进行很多次的连接(+)操作时
String性能就会大打折扣
从而StringBuffer就出现了
以提高这方面的性能