2016-05-29 6 views
0

ich iterieren eine HashMap mit dieser Methode:get von HashMap null wird während itteration

public void printMap(Map mp) { 
     Iterator it = mp.entrySet().iterator(); 
     while (it.hasNext()) { 
     Map.Entry pair = (Map.Entry)it.next(); 
     System.out.println(pair.getKey() + " = " + pair.getValue() + " " + mp.get("objectId")); 
    } 
     it.remove(); // avoids a ConcurrentModificationException 
    } 

Das Ergebnis ist:

Key1 = Value1 objectIDValue 
Key2 = Value2 objectIDValue 
objectId = objectIDValue objectIDValue 
Key4 = Value4 null 
Key5 = Value5 null 
... 

Warum mp.get ist ("objectId") wird null, wenn die Schlüssel ist bestanden?

Antwort

0

Es sieht nicht möglich, es sei denn, das Paar wird von einem anderen Thread gelöscht. Wird diese Methode gleichzeitig aufgerufen? Wenn dies der Fall ist, kann das Paar durch it.remove() seit Einfügereihenfolge und gelöscht werden. Die Iterationsreihenfolge ist nicht garantiert identisch für HashMap.

0

Dies ist höchstwahrscheinlich ein Nebenläufigkeitsproblem. Ich würde versuchen, eine thread-sichere Kartenimplementierung wie ConcurrentHashMap zu verwenden. Außerdem entfernt Ihre Methode den letzten Eintrag in der Iteration, der sich je nach der von Ihnen ausgewählten Kartenimplementierung ändern kann.