web-dev-qa-db-ja.com

Java値渡しと参照渡し

私は私の知識をチェックするために次のサンプルを行いました

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値渡しまたは参照渡し???

ありがとう

9
SAR

Javaは常に値渡しのみですが、この場合、HashMapの参照は値で渡されますvalueMapは、inputMapと同じオブジェクトを参照します。

そのため、valueMapを使用してキーと値のペアを追加すると、両方が同じHashMapオブジェクトを参照しているため、inputMapに反映されます。

この回答 byEng.Fouadは、この概念を非常にうまく説明しています。

14
SudoRahul

Javaは値渡しです。しかし、あなたの疑問は参照を参照しています。Java値渡しです。

したがって、参照値が渡され、マップが有効になります。

値渡しという用語と混同しました。 値渡し値として渡される参照の意味で。

5
Suresh Atta

useDifferentMap(inputMap)が呼び出されると、inputMapがパラメータMap<String, String> valueMapに割り当てられます。

Map<String, String> valueMap = inputMap;

割り当て後、2つの参照inputMapvalueMapはメモリ内の同じオブジェクトを参照するため、一方の参照を介してそのオブジェクトを変更すると、もう一方の参照に反映されます。

3
Eng.Fouad

Javaは値渡しのみです。参照渡しの場所はありません。 inputMapvalueMap(inputMapのコピー)は両方とも同じハッシュマップへの参照です。したがって、参照のいずれかを使用して、ハッシュマップ上のすべてのメソッドにアクセスできます。これは、同じテレビへの2つのリモコンのようなものです。

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

これを試して。それがpass-by-refの場合、useDifferentMap()を呼び出した後、mainメソッドの最後の行にNPEが含まれているはずです。

1
jai