我做了以下示例以检查我的知识
import java.util.Map;
public class HashMap {
public static Map<String, String> useDifferentMap(Map<String, String> valueMap) {
valueMap.put("lastName", "yyyy");
return valueMap;
}
public static void main(String[] args) {
Map<String, String> inputMap = new java.util.HashMap<String, String>();
inputMap.put("firstName", "xxxx");
inputMap.put("initial", "S");
System.out.println("inputMap : 1 " + inputMap);
System.out.println("changeMe : " + useDifferentMap(inputMap));
System.out.println("inputMap : 2 " + inputMap);
}
}
输出是:
original Map : 1 {initial=S, firstName=xxxx}
useDifferentMap : {lastName=yyyy, initial=S, firstName=xxxx}
original Map : 2 {lastName=yyyy, initial=S, firstName=xxxx}
此方法useDifferentMap
获取地图并更改值并返回相同的值。
修改后的地图将包含修改后的值,其范围是useDifferentMap
方法的本地范围。
我的问题是,如果java是按值传递的,则修改后的值不应该在原始地图中受到影响。
java传递值或通过引用传递???
感谢
答案 0 :(得分:11)
Java始终只是按值传递,只是在这种情况下,HashMap的引用按值传递。 valueMap
引用与inputMap
相同的对象。
这就是为什么当你使用valueMap
添加一个键值对时,它会反映在inputMap
中,因为它们都指的是同一个HashMap对象。
This answer非常好地解释了这个概念。
答案 1 :(得分:3)
Java是按值传递的。但是您的怀疑是引用,甚至引用java传递的值。
因此传递参考值,地图就会生效。
你对术语传递值感到困惑。在作为值传递的意义参考中按值传递。
答案 2 :(得分:3)
调用useDifferentMap(inputMap)
后,inputMap
被分配给参数Map<String, String> valueMap
:
Map<String, String> valueMap = inputMap;
分配后,两个引用inputMap
和valueMap
现在引用内存中的同一个对象,因此通过一个引用修改该对象,将反映到另一个引用。
答案 3 :(得分:1)
Java仅是pass-byvalue。不在哪里传递参考。
inputMap
和valueMap
(inputMap的副本)都是对同一个hashmap的引用。因此,我们可以使用任一引用访问哈希映射上的所有方法 - 它就像两个遥控器一样访问同一台电视。
public static Map<String, String> useDifferentMap(Map<String, String> valueMap) {
valueMap=null;
}
试试这个。如果是pass-by-ref,那么在调用useDifferentMap()
后,你会在main方法的最后一行得到NPE