【问题标题】:Java Pass By Value and Pass By Reference [duplicate]Java按值传递和按引用传递[重复]
【发布时间】:2013-12-02 13:38:01
【问题描述】:

我已经完成了以下示例来检查我的知识

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是传值还是传引用???

谢谢

【问题讨论】:

  • 反对的选民需要解释,这是有效的问题
  • 仅在 SO 上就被询问和回答了大约 100 次(在“网络上的其他地方”就更少了),只需查看右侧的“相关”列表即可。这可能就是人们不赞成它的原因,因为“研究工作”会在这个网站上找到答案。
  • Java 总是passed by value。由于无法传递对象,对象引用passed by value

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


【解决方案1】:

Java 总是使用 pass-by-value 概念来传递参数。在提到的场景中,对 HashMap 本身的引用是按值传递的valueMapinputMap 引用同一个对象,因为它们都引用同一个对象。

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

查看 Eng.Fouadthis simple, yet nicely written answer 以获取该概念的图片版本。请随意阅读同一问题中包含更深入信息的更多答案。

【讨论】:

    【解决方案2】:

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

    所以参考值通过了,地图就生效了。

    您与按值传递一词混淆了。 按值传递在作为值传递的感觉引用中。

    【讨论】:

      【解决方案3】:

      useDifferentMap(inputMap)被调用时,inputMap被赋值给参数Map&lt;String, String&gt; valueMap

      Map<String, String> valueMap = inputMap;
      

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

      【讨论】:

        【解决方案4】:

        Java 只是按值传递。没有它是通过引用传递的。 inputMapvalueMap(inputMap 的副本) 都是对同一个 hashmap 的引用。因此,我们可以使用任一引用访问散列映射上的所有方法 - 就像同一台电视的两个遥控器一样。

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

        试试这个。如果它是 pass-by-ref,那么在调用 useDifferentMap() 之后,你会在 main 方法的最后一行得到 NPE

        【讨论】:

          猜你喜欢
          • 2012-03-12
          • 2013-09-15
          • 2012-03-13
          • 2014-09-10
          • 2023-03-07
          • 1970-01-01
          • 2011-05-16
          • 2011-05-29
          • 2019-05-07
          相关资源
          最近更新 更多