求大神解释,我实在搞不懂

public static void main(String[] args) {
Map map = new HashMap();
map.put("12313", "12313");
System.out.println(map);
System.out.println("-----------");
clearMap(map);
System.out.println(map);
}

private static void clearMap(Map<String, String> map) {
    map = new HashMap<String, String>();
    map.put("add", "addd");

}

为什么打印结果是

{12313=12313}

{12313=12313}

但是
public static void main(String[] args) {
Map map = new HashMap();
map.put("12313", "12313");
System.out.println(map);
System.out.println("-----------");
clearMap(map);
System.out.println(map);
}

private static void clearMap(Map<String, String> map) {
    map.put("add", "addd");

}
打印出来的却是:

{12313=12313}

{12313=12313, add=addd}

4个回答

1.方法之间传递的是引用地址,第一个传递了一个引用的地址给clearMap,
但是你的new操作将地址指向了另外一个堆内存对象,然后对新的堆内存对象进行操作,
所以不会改变第一个对象。

2.第二个你没有改变其引用,直接在第一个对象上进行操作

3.你两次输出的都是第一个对象

综上所述,就能解释你的输出了,这里不好画图,要是能画图,你应该一看就明白了

希望能够帮到你....

MyEclipse_1214
开心1002 回复little_how: 噢。。大概知道了。。
大约 4 年之前 回复
w172087242
little_how 回复MyEclipse_1214: 这里画不了图,反正你记住,java中只有值传递,没有引用传递就可以,对map引用的传递,在它进入方法的时候就与原来的引用没关系了,只是同样是指向了一个堆内存地址,所以才能有后续的操作
大约 4 年之前 回复
MyEclipse_1214
开心1002 回复little_how: 求画图0 0大神。。。方便理解 感激不尽
大约 4 年之前 回复
w172087242
little_how 回复MyEclipse_1214: java中没用c语言那种真实的引用传递,也就是说你的map指向新地址,其实是影响不到调用方法中的那个引用的,java只有值传递。
大约 4 年之前 回复
MyEclipse_1214
开心1002 但是 第一个 new的HashMap被指向了 原来的变量啊 那原来的变量不应该指向这个新的map实例吗? 大神说的我其实能懂,但是并不是很理解。。和我当初学习的引用类型传递,是有点不一样啊。。
大约 4 年之前 回复

画的不好,凑合看吧图片说明

MyEclipse_1214
开心1002 谢谢大神 感激不尽! 大概懂了。。。。谢谢~
大约 4 年之前 回复
MyEclipse_1214
开心1002 谢谢大神
大约 4 年之前 回复

第一个 例子 我可以解释为 ,clearMap 方法 操作的那个map引用是个局部变量,那方法生命周期结束了,map就消失了,所以main方法中的map一直没变,
但是第二个例子又告诉我,clearMap 操作的就是传递过来的引用,所以就是操作实际的对象,main方法中的map被改变了。。
我在学习java的时候就告诉我 基本类型和引用类型的区别。。第一个例子map表现的就是基本类型,第二个例子map表现则是正常的引用类型,也是我想象中的

所以求大神 指导,这到底是为啥。。。。。。。。。。。。。。

实践是真理检验的唯一标准,你在需要记录的地方打印map的地址值就应该能明了

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐