Java Pass By Value和Pass By Reference

时间:2013-11-19 05:48:12

标签: java hashmap pass-by-reference pass-by-value

我做了以下示例以检查我的知识

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传递值或通过引用传递???

感谢

4 个答案:

答案 0 :(得分:11)

Java始终只是按值传递,只是在这种情况下,HashMap的引用按值传递valueMap引用与inputMap相同的对象。

这就是为什么当你使用valueMap添加一个键值对时,它会反映在inputMap中,因为它们都指的是同一个HashMap对象。

Eng.Fouad

This answer非常好地解释了这个概念。

答案 1 :(得分:3)

Java是按值传递的。但是您的怀疑是引用,甚至引用java传递的值。

因此传递参考值,地图就会生效。

你对术语传递值感到困惑。在作为值传递的意义参考中按值传递

答案 2 :(得分:3)

调用useDifferentMap(inputMap)后,inputMap被分配给参数Map<String, String> valueMap

Map<String, String> valueMap = inputMap;

分配后,两个引用inputMapvalueMap现在引用内存中的同一个对象,因此通过一个引用修改该对象,将反映到另一个引用。

答案 3 :(得分:1)

Java仅是pass-byvalue。不在哪里传递参考。 inputMapvalueMap(inputMap的副本)都是对同一个hashmap的引用。因此,我们可以使用任一引用访问哈希映射上的所有方法 - 它就像两个遥控器一样访问同一台电视。

public static Map<String, String> useDifferentMap(Map<String, String> valueMap) {
            valueMap=null;
        }

试试这个。如果是pass-by-ref,那么在调用useDifferentMap()

后,你会在main方法的最后一行得到NPE