2017-03-22 12 views
-1

Eclipse IDE上で並行HashMapを使用していましたが、同時に並行HashMapのキーを変更している間に、出力も変更されていました。
ケースI:
キーの値を変更すると、並行HashMapで出力が変更されるのはなぜですか?

public static void main(String[] args) {  
    ConcurrentHashMap<String, String> concurrentHashMap= new ConcurrentHashMap<String, String>(); 
    concurrentHashMap.put("Fav Rap", "Eminem"); 
    concurrentHashMap.put("Fav Food", "Pizza"); 
    concurrentHashMap.put("Pop", "Jackson"); 

    for(Map.Entry<String, String> entry : concurrentHashMap.entrySet()){ 
     concurrentHashMap.put("Fav Game", "Fifa"); 
     concurrentHashMap.put("student", "smith"); 

     System.out.println("Key : "+entry.getKey()+", Value : "+entry.getValue()+" hashcode: "+entry.hashCode()+" size: "+concurrentHashMap.size()); 
    } 

} 

出力は次のようになります。

キー:ポップ、値:ジャクソンのハッシュコード:-172386558サイズ:5

キー:たツイートラップ、価値:エミネムのハッシュコード:1491542025サイズ:5

キー:生徒、値:smithハッシュコード:-1988544968サイズ:5

キー:たツイートゲーム、価値:FIFAのハッシュコード:1043213001サイズ:5

キー:たツイート食品、価値:ピザのハッシュコード:983035627サイズ:5

ケースII:

public static void main(String[] args) { 
    ConcurrentHashMap<String, String> concurrentHashMap= new ConcurrentHashMap<String, String>(); 
    concurrentHashMap.put("Fav1 Rap", "Eminem"); 
    concurrentHashMap.put("Fav Food", "Pizza"); 
    concurrentHashMap.put("Pop", "Jackson"); 

    for(Map.Entry<String, String> entry : concurrentHashMap.entrySet()){ 
     concurrentHashMap.put("Fav Game", "Fifa"); 
     concurrentHashMap.put("student", "smith"); 
     System.out.println("Key : "+entry.getKey()+", Value : "+entry.getValue()+" hashcode: "+entry.hashCode()+" size: "+concurrentHashMap.size()); 
    } 

} 

出力次のとおりです。

キー:ポップ、値:ジャクソンハッシュコード:-172386558サイズ:5

キー:Fav1ラップ、価値:エミネムハッシュコード:11578 29666サイズ:

5キー:たツイート食品、価値:ピザのハッシュコード:983035627サイズ:5

私はちょうどFav1と出力が変化するたツイートからマップの最初のキーを変更しました。 あなたは疑いを明確にしてください。事前に感謝:)

+0

favラップとfav1ラップは異なるオブジェクトであるためです。そのため、キーの名前を変更したにもかかわらず、新しいオブジェクトが作成されます。 –

+0

コード内の現在のエントリのキーに変更がありません。あなたは基本的にあなたのマップに基本的に2つのエントリを追加しています。 – imprezzeb

+0

@ Mr.Aw私はそれがFav1ラップの新しいオブジェクトを作成することに同意します。しかし、Favゲームと学生の他の2つのエントリはどうなりますか?リストのサイズは5と思われますが、表示されるデータの数は3です。私の懸念を理解していただきたいと思います。 –

答えて

2

これは、同時ハッシュマップの仕組みです。すべての値を加えた後に見てみると、出力は同じになります。反復処理中は、イテレータ内のオブジェクト参照ごとに異なる場合があるため、その中に項目を追加します。 ConcurrentHashMapの中(GET含む)

+0

ケースIIで鋭敏に見える場合は、キーをFav Rapから変更しています)をFav1 Rap(ケースII)に変更しました。 OK。だから私はそれがFav1ラップのための新しいオブジェクトを作成することに同意します。しかし、地図のサイズは2番目のケースでは5のように見えますが、なぜそれは3つの値しか印刷しませんか?あなたが私の心配を理解したことを願って –

+0

これは、3つの値で構成されたマップのentrysetオブジェクトを反復処理していて、マップコンテンツを反復しているときに2つの余分な値が追加されていますが、 – Aditya

+0

ケースIはどうですか?私は同じentrysetオブジェクトを反復している場合でも、5つの値をすべて出力します。 Fav RapからFav1 Rapへのキー(文字列)を変更するときだけ、3つの値を表示した後にループを終了させますが、マップのサイズはまだ5のままです。あなたの助けを感謝します:) –

0

検索操作はブロックされませんので、更新操作と重複(あなたのケースのようプット(を含む)、および削除)があります。

+0

お返事ありがとうございます。ケースIIで鋭く見ている場合は、キーをFav Rap(ケースI)からFav1 Rap(ケースII)に変更しています。 OK。だから私はそれがFav1ラップのための新しいオブジェクトを作成することに同意します。しかし、なぜ表示されているのに、サイズは2番目のケースでは5と思われますが、なぜ3つの値しか印刷されません。あなたが私の心配を理解したことを願って –

0

私はあなたのプロジェクトを再コンパイルしてみるべきだと思います。私のIDEであなたのコードを試したので。それはうまくいった。それは、ケースIのように私に5つの出力を与えました。ここで私はFav RapをFav1 Rapに変更しました。

Key : Fav Food, Value : Pizza hashcode: 983035627 size: 5 
    Key : Pop, Value : Jackson hashcode: -172386558 size: 5 
    Key : Fav1 Rap, Value : Eminem hashcode: 1157829666 size: 5 
    Key : Fav Game, Value : Fifa hashcode: 1043213001 size: 5 
    Key : student, Value : smith hashcode: -1988544968 size: 5 
+0

あああ!!!私はEclipse IDEで作業していた。とにかくありがとう。私は日食に取り組んでいる間、何が間違っているのか把握しなければならない。 –

+0

それは役に立ちましたか?あなたは私の答えと票をチェックして評判を得ることができますか?ハハ。 –

関連する問題