2016-05-16 16 views
0

私はキーとして整数を使用し、対応する値としてListを持つMapオブジェクトを持っています。ここに私のコードです。HashMapの値が更新されない

Map<Integer, List<Double>> dataDouble = new HashMap<Integer, List<Double>>(); 
List<Double> dubList = new ArrayList<Double>(); 
for(double i = 0; i < 10; i++) 
    dubList.add(i); 

dataDouble.put(1, dubList); 
//dubList.clear(); 

for(int i = 10; i < 16; i++) 
    dubList.add(i); 

dataDouble.put(2, dubList); 

Set<Integer> keyset = dataDouble.keySet(); 

for(Integer key : keyset) { 
    System.out.println("\t\tKEY: " + key); 
    List<Double> finList = dataDouble.get(key); 
    for(double value : finList) 
     System.out.println("VALUE: " + value);  

    } 
} 

私は2番目のリストが更新されませんその後、明確な声明が含まれていない、と私はprint文では1〜10の2ブロックを取得する場合。 clearコマンドを追加すると、2つのブロックに10-15しか印刷されません。

私の質問は、なぜクリアコマンドが既にマップに追加されたデータをクリアしていて、なぜ新しいデータをリストに追加してマップ上に置くと実際に値が変更されないのでしょうか?

編集:私は私はあなたがマップに追加しているすべてのエントリに同じオブジェクトを使用している二重の値

+0

リストはオブジェクトです。 1つのリスト 'dubList'を作成するだけです。あなたが 'dataDouble'にそれを何回追加しても、それは同じオブジェクト、同じリストになるでしょう。 –

+0

マップ内の値は実際には設定されておらず、代わりにオブジェクト自体を指していますか? –

+0

@PeytonC。オブジェクトの参照を指しているので、それをリストに追加すると、新しいArrayListを初期化していないので、 'dubList'という名前の' ArrayList'への参照を追加しています。 '。 – Orin

答えて

2

あなたはHashMapに異なるキーの下で異なるArrayListを入れていません。 同じArrayListをそれぞれ下に置いています。つまり、それに加えられた変更はすべて(すべて同じオブジェクトなので)すべてに反映されます。

複数の異なるListを使用する場合は、new ArrayList<>()で新しいものを作成する必要があります。したがって、clearの行をdubList = new ArrayList<>()に置き換えると、新しいインスタンスが正しく提供されます。

2

を扱っています、私の実際のプロジェクトでは、intの代わりに、二重使用しています知っています。

追加した後、参照が指しているListを変更します。

dataDouble.put(1, dubList); 
dubList = new ArrayList<>(); <--- HERE 

for(int i = 10; i < 16; i++) 
    dubList.add(i); 
1

dubListという名前のArrayListへの参照を使用し、その参照をマップに2回追加しています。 2つの別個の宣言が必要です。ArrayList

Map<Integer, List<Double>> dataDouble = new HashMap<Integer, List<Double>>(); 
List<Double> dubList = new ArrayList<Double>(); 
for(double i = 0; i < 10; i++) 
    dubList.add(i); 

dataDouble.put(1, dubList); 

//add a new ArrayList 
List<Double> dubList2 = new ArrayList<Double>(); 

for(int i = 10; i < 16; i++) 
    dubList2.add(i); 

dataDouble.put(2, dubList2); 

Set<Integer> keyset = dataDouble.keySet(); 

for(Integer key : keyset) { 
    System.out.println("\t\tKEY: " + key); 
    List<Double> finList = dataDouble.get(key); 
    for(double value : finList) 
     System.out.println("VALUE: " + value); 
    } 
} 
関連する問題