私は私の知識をチェックするために次のサンプルを行いました
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値渡しまたは参照渡し???
ありがとう
Javaは常に値渡しのみですが、この場合、HashMapの参照は値で渡されます。 valueMap
は、inputMap
と同じオブジェクトを参照します。
そのため、valueMap
を使用してキーと値のペアを追加すると、両方が同じHashMapオブジェクトを参照しているため、inputMap
に反映されます。
この回答 byEng.Fouadは、この概念を非常にうまく説明しています。
Javaは値渡しです。しかし、あなたの疑問は参照を参照しています。Java値渡しです。
したがって、参照値が渡され、マップが有効になります。
値渡しという用語と混同しました。 値渡し値として渡される参照の意味で。
useDifferentMap(inputMap)
が呼び出されると、inputMap
がパラメータMap<String, String> valueMap
に割り当てられます。
Map<String, String> valueMap = inputMap;
割り当て後、2つの参照inputMap
とvalueMap
はメモリ内の同じオブジェクトを参照するため、一方の参照を介してそのオブジェクトを変更すると、もう一方の参照に反映されます。
Javaは値渡しのみです。参照渡しの場所はありません。 inputMap
とvalueMap
(inputMapのコピー)は両方とも同じハッシュマップへの参照です。したがって、参照のいずれかを使用して、ハッシュマップ上のすべてのメソッドにアクセスできます。これは、同じテレビへの2つのリモコンのようなものです。
public static Map<String, String> useDifferentMap(Map<String, String> valueMap) {
valueMap=null;
}
これを試して。それがpass-by-refの場合、useDifferentMap()を呼び出した後、mainメソッドの最後の行にNPEが含まれているはずです。