3

奇妙な状況があります-次のように初期化される HashMap があります。

    HashMap<String, HashSet<String>> downloadMap = new HashMap<String, HashSet<String>>();

そして、クォーツスケジューラを介して無期限に実行される次のものがあります。

    myHashSet = retrieve(animal);
    downloadMap.put(myKey, myHashSet);
    // do stuff
    downloadMap.get(myKey).clear();

その後、1 つの値が異なるキーに関連付けられます。したがって、たとえば、次のようなものがあります。

 Kitens [cute kitten, sad kitten]
 Puppies [cute kitten, sad kitten]

これは決して起こるべきではありません。

特に、子猫の HashSet を取得した後:

 myHashSet = retrieve(animal);

myHashSet = [かわいい子猫、悲しい子猫] downloadMap = 子猫 []、子犬 []

次に put() が実行され、次のようになります。

 downloadMap =  Kitens [cute kitten, sad kitten], Puppies [cute kitten, sad kitten]

なぜこれが事実なのか誰にも分かりますか?

前もって感謝します!

4

2 に答える 2

3

のすべての値で同じHashSet<String>参照を使用しているようですHashMap<String, HashSet<String>>。これを知っていると、問題は にHashSet<String>sを挿入する方法ですHashMapHashSet<String>キーと値のペアごとに新しい参照を使用する必要があることに注意してください。

より具体的な回答を得るには、それに応じて質問を更新してください。

実際の問題に直接関連するわけではありませんが、クラスを直接実装するよりもインターフェイス指向のプログラムを作成する方が適切です。downloadMapこれで、変数を次のように宣言する必要があることを意味します

Map<String, Set<String>> downloadMap = new HashMap<String, Set<String>>();

Setこのマップに配置される s についても同様です。

より詳しい情報:

于 2013-09-03T03:00:21.823 に答える