String对象值传递和引用传递
最近在看堆栈和值传递与引用传递,对这两个概念有了一定的认识,但对待string对象上海存在疑惑,请大家帮忙指正。我觉得str1,经过operate后应该为abcdef,str2经过operate方法后应该为abc,现在str1经过方法后,结果依然为abc。可str1为new出来的对象,传递的应该是引用,操作时,应该修改的是堆内的值,然后让str1指向其值,请问我的理解有何错误,请批评斧正。谢谢。
值传递 引用传递
static void operate(String str) {
str += "def";
}
static void mapAdd(Map<String, String> map) {
map.put("aa", "aa");
}
public static void main(String[] args) {
String str1 = new String("abc");
String str2 = "abc";
operate(str1);
// str1指向了堆中new出的对象abc,像operate传递时,应该传递的是str1的引用
// 在方法中操作后,str1应该指向到操作后的新的对象,也就是abcdef
System.out.println(str1);
operate(str2);
// str2为栈中的对象,传递的就是abc数值,方法操作完后,新的值仅仅是方法中的局部变量
// 值未带出到main方法中来,所以str2还应该是abc
System.out.println(str2);
Map<String, String> map = new HashMap<String, String>();
map.put("bb", "bb");
// 这里没有疑问,mapAdd中传递的map为对象,传递的是引用,操作后map指向了操作后堆中的map值
// 操作后,main方法中map中有两队值。
mapAdd(map);
for (String str : map.keySet()) {
System.out.println(str);
}
}