class test {
public static void main(String[]args)
{
String s1 = "java";
String s2 = "hello";
method_1(s1,s2);
System.out.println(s1+"...."+s2);
StringBuilder s11 = new StringBuilder("java");
StringBuilder s22 = new StringBuilder("hello");
method_2(s11,s22);
System.out.println(s11+"-----"+s22);
}
public static void method_1(String s1,String s2)
{
s1.replace('a','k');
s1=s2;
}
public static void method_2(StringBuilder s1,StringBuilder s2)
{
s1.append(s2);
s1=s2;
}
}
------解决方案--------------------
public static void main(String[]args) {
String s1 = "java";
String s2 = "hello";
// 传递s1,s2的拷贝到method_1方法
// 由于s1 和 s2 均为字符常量,故method_1里面的操作不会对外部的s1,s2造成任何影响
method_1(s1,s2);
System.out.println(s1+"...."+s2);
StringBuilder s11 = new StringBuilder("java");
StringBuilder s22 = new StringBuilder("hello");
// 传递s11,s22的拷贝到method_2方法
method_2(s11,s22);
// s11 在方法内被修改为了javahello,s22 依然为hello
System.out.println(s11+"-----"+s22);
}
// 此方法内的操作,操作的均为s1 和 s2 的拷贝
public static void method_1(String s1,String s2){
// 将a替换为k s1 为jkvk,但replace返回的是新字符串
// 故此操作不会对s1 造成影响 s1 仍为 java
s1.replace('a','k');
s1=s2; // 将s2的值赋给s1, s1 和 s2 同为 hello
}
// 此方法内的操作,操作的均为s11 和 s22 的拷贝
public static void method_2(StringBuilder s1,StringBuilder s2) {
// s11的拷贝所指的对象后面添加字符hello,s11的拷贝即s1 为javahello
s1.append(s2);
// 将s11的拷贝指向s22的拷贝,此时s11便不再影响s1了。
// s11的拷贝 重新指向s22的拷贝所指的对象,s11的拷贝 和 s22的拷贝同为 hello
s1=s2;
}