Java按值传递和按引用传递

12

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

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

谢谢


1
投反对票的人需要解释,这是一个合理的问题。 - Joe
这个问题在SO上已经被问答了大约100次(更不用说在其他地方的网络上),只需要看一下右边的“相关”列表就可以找到答案。这可能是人们为什么会对它进行投票否决的原因,因为“研究努力”就可以在这个网站上找到答案。 - T.J. Crowder
3
Java始终是按值传递。由于对象本身无法被传递,因此对象引用是按值传递的。 - Prateek
4个回答

18

Java始终使用按值传递的概念来传递参数,在所提到的情况下,HashMap本身的引用是按值传递的。因为两个变量都引用同一个对象,所以valueMapinputMap都指向同一个对象。

这就是为什么当你使用valueMap添加键-值对时,会在inputMap中反映出来的原因。

查看Eng.Fouad这个简单且精美的解答 ,它有一个图片化的概念阐述。如有需要,可以阅读该问题中更详细的其他答案。


5

Java是按值传递的。但你的疑问涉及引用,即使在java中,引用也是按值传递的。

因此,引用值被传递,映射会受到影响。

你对“按值传递”的术语感到困惑。在这里,“按值传递”指的是引用被作为值传递。


3
当调用useDifferentMap(inputMap)函数时,inputMap被赋值给参数Map<String, String> valueMap
Map<String, String> valueMap = inputMap;

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


1
Java仅支持按值传递,不支持按引用传递。 inputMapvalueMapinputMap的副本)都是对同一哈希表的引用。因此,我们可以使用任何一个引用来访问哈希表上的所有方法 - 就像对同一台电视机有两个遥控器。
public static Map<String, String> useDifferentMap(Map<String, String> valueMap) {
            valueMap=null;
        }

尝试一下。如果它是按引用传递,那么在调用useDifferentMap()后,在main方法的最后一行会得到NPE。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接