Java按值传递和按引用传递

Java按值传递和按引用传递,java,hashmap,pass-by-reference,pass-by-value,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 sta

我已经做了下面的示例来检查我的知识

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);
    }
}
此方法
usedifferencemap
获取映射并更改值并返回相同的值。 修改后的映射将包含修改后的值,其范围是
usedifferencemap
方法的本地范围

我的问题是,如果java是通过值传递的,那么修改后的值不应该在原始映射中受到影响

那么java是按值传递还是按引用传递


谢谢Java总是使用传递值的概念来传递参数。在前面提到的场景中,对HashMap本身的引用是通过值传递的。
valueMap
引用的对象与
inputMap
引用的对象相同,因为两者都引用同一对象

这就是为什么当您使用
valueMap
添加键值对时,它会反映回
inputMap


由Eng.Fouad为该概念的图片化版本结账。请随意阅读同一问题中的更多答案,这些答案包含更深入的信息。

Java是按值传递的。但您的疑问在于引用,甚至Java中的引用也是按值传递的

因此,通过了引用值,映射就生效了

您混淆了术语“按值传递”按值传递在引用作为值传递的意义上。

当调用
useDifferentMap(inputMap)
时,
inputMap
被分配给参数
Map valueMap

Map<String, String> valueMap = inputMap;
Map valueMap=inputMap;

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

Java仅为按值传递。没有通过引用传递的位置。
inputMap
valueMap
(inputMap的副本)都是对同一hashmap的引用。因此,我们可以使用任意一个引用访问哈希映射上的所有方法,就像同一台电视的两个遥控器一样

public static Map<String, String> useDifferentMap(Map<String, String> valueMap) {
            valueMap=null;
        }
公共静态映射使用不同的映射(映射值映射){
valueMap=null;
}

试试这个。如果它是通过引用的,那么在调用UseDifferentitMap()之后,NPE就会出现在main方法的最后一行。

选民需要解释,这是一个有效的问题,仅此一项就被询问和回答了大约100次(更不用说在“网络”的其他地方了),只需查看右侧的“相关”列表即可。这可能就是为什么人们对它投了反对票,因为“研究工作”会在这个网站上找到答案。由于无法传递对象,对象引用按值传递
public static Map<String, String> useDifferentMap(Map<String, String> valueMap) {
            valueMap=null;
        }