2017-06-09 9 views
0

なぜ私のハッシュマップが更新されているのか少し混乱しています。私が代わりにこれを得ないでしょうなぜJavaハッシュマップで更新したくないときに更新する

{1={Jason=15}, 2={Jason=15}} 

firstMap.put("Jason", 2); 
finalMap.put(1, firstMap); 

firstMap.put("Jason", 15); 
finalMap.put(2, firstMap); 
System.out.println(finalMap); 

私はこれを取得:私はこれを実行すると、今

Map<String, Integer> firstMap = new HashMap<String, Integer>(); 

Map<Integer, Map<String, Integer>> finalMap = new HashMap<Integer, Map<String, Integer>>(); 

:一例として、私は以下のハッシュマップを持っています?これは私が欲しいものです。

{1={Jason=2}, 2={Jason=15}} 

大変感謝しています。

+4

'finalMap'には' firstMap'が2回含まれています。 2つのマップではなく、1つのマップが2回あります。 – khelwood

答えて

1

:あることを示すために、

。あなたのコードのために求めているものを得るためには

は、代わりに次のようになります。

Map<String, Integer> firstMap = new HashMap<String, Integer>(); 

Map<Integer, Map<String, Integer>> finalMap = new HashMap<Integer, Map<String, Integer>>(); 

firstMap.put("Jason", 2); 
finalMap.put(1, firstMap); 

// here we create a new instance of that HashMap 
firstMap = new HashMap<String, Integer>(); 

firstMap.put("Jason", 15); 
finalMap.put(2, firstMap); 
System.out.println(finalMap); 

は、この情報がお役に立てば幸いです。

+0

異なる目的のために同じ変数を再利用することは悪い習慣です。これはある日あなたを狩るかもしれない。 – MaxZoom

+1

変数の再利用が難しくなるケースがあるかもしれませんが、この特定の制限された文脈では、私はWhitneyChiaが求めたものを達成するために必要な最小限の変更を強調しました。 –

1

anotherFirstMapオブジェクト(別のハッシュマップ)を作成する必要があります。同じハッシュマップではありません。同じハッシュマップは必ず値を更新します

firstMap.put("Jason", 2); 
finalMap.put(1, firstMap); 

anotherFirstMap.put("Jason", 15); 
finalMap.put(2, anotherFirstMap); 
System.out.println(finalMap); 
0

マップキーは一意です。既存のキーを指定するときにputをマップに発行すると、そのキーの元の値が上書きされます。

From java.util.Map#put(K key, V value)

関連付けこのマップ(オプション)内の指定されたキーに指定された値。以前マップにキーのマッピングが含まれていた場合、古い値は指定された値に置き換えられます。 (マップmはとm.containsKey(k)がtrueを返す場合だけ、キーkのマッピングを含むと言われている。)

あなたが何をしたいのかを達成するために、あなたはfinalMap以上のものを必要とします。 {Jason = 2}と{Jason = 15}の2つのマップが必要です。

1

あなたはハッシュマップだけで(この場合firstMapで)そのオブジェクトへの参照を格納するハッシュマップに何かを置きます。それはオブジェクトをコピーしません(あなたの期待した結果につながります)!

あなたがfirstMap.put("Jason", 15);を行うと、あなたがfirstMapを変更。

finalMapを印刷すると、すべての参照が解除され、印刷されます。しかし、両方のキーが同じオブジェクト(変更されたfirstMap)につながります。あなたはまだfirstMapの同じインスタンスを使用しているので、あなたが実際に値2を上書きする値15に「ジェイソン」を関連付けるとき、あなたのコードで

firstMap.put("Jason", 2); 
System.out.println(firstMap); // {"Jason"=2} 
finalMap.put(1, firstMap); 
System.out.println(finalMap); // {1={"Jason"=15}} 

firstMap.put("Jason", 15); 
System.out.println(firstMap); // {"Jason"=15} 
finalMap.put(2, firstMap); 
System.out.println(finalMap); // {1={"Jason"=15},2={"Jason"=15}} 
関連する問題