-1

次のように HashMap を作成しています。

private HashMap <String, JSONArray> HiveMap;
HiveMap = new HashMap <String, JSONArray>();

また、計算が完了した後に HashMap に入れられる計算されたデータを格納するためのプライベート クラス変数もあります。

private JSONArray hiveList;

hiveList が計算された後、作成した HashMap (HiveMap) に hiveList を配置します。

HiveMap.put(hiveNode,hiveList);

ここで HiveMap を印刷すると、期待どおりの出力が得られ、フィールドhiveNodehiveList既存の両方が Hashmap に含まれています。<"hiveNode":"hiveList">

これが完了した後、HashMap に入れたデータはhiveList永続化されると想定しているため、次のコマンドを使用して hiveList 配列をクリアします。hiveList.clear();

しかし、hiveList をクリアした後に Hashmap を出力すると、hiveList のデータが HashMap からも削除されていることがわかります。

hiveList をクリアした後に HashMap を出力すると、次のようになります。<"hiveNode": >

私はこの振る舞いを理解していません。誰かがこれに光を当てることができれば幸いです。

4

4 に答える 4

8

エラーは次のとおりです。

これが完了した後、hiveList から HashMap に入れたデータは保持されると想定しているため、hiveList.clear(); を使用して hiveList 配列をクリアします。

ハッシュ マップに渡されるのは、リストのコピーではなく、リストへの参照です。

最も簡単な修正方法は、インスタンスをクリアするのではなく、新しいインスタンスを作成することです。または、コピーを作成してマップに配置することもできます。

于 2013-08-06T18:30:06.393 に答える
3

hiveListリストと に値として存在するリストはまったく同じMapであり、変数と の両方が同じオブジェクトへの参照Mapを保持しています。1 つのリストを使用すると、もう 1 つのリストも空になります。リストは 2 つではなく 1 つです。clear()

何らかの理由でクリアして再利用する必要ある場合(理由がわかりません)、 に別のリストを配置する必要があります。浅いコピーを行う方法は次のとおりです。hiveListMap

HiveMap.put(hiveNode, new ArrayList<Hive>(hiveList));

<Hive>リスト内の要素の実際のタイプに置き換えます。

于 2013-08-06T18:31:17.177 に答える