2 Stimmen

HashMap - korrekte Verwendung?

Ich versuche, eine MMS-Nachricht mit mehreren Anhängen zu verarbeiten. Dazu erstelle ich eine HashMap wie folgt (dies ist nicht die komplette Implementierung, sondern nur der relevante Teil):

    HashMap<String, Integer> hashAttachments = new HashMap<String, Integer>();
    int c = 0;
    if(atts != null) {
        for(Attachment a : atts){
            if(a.mimeType.startsWith("image/")){
                            <some code here>
                hashAttachments.put(a.fileName, indx);
            }else if(a.mimeType.startsWith("text/")){
                <some code here>
                hashAttachments.put("text_"+String.valueOf(c++)+".txt",indx);
            }
                    <some more mime types>
        } /* for */

die Nachricht, die ich zu verarbeiten versuche, hat 4 Anhänge - zwei Bilder und zwei Texte, so dass ich erwarte, dass die Hash-Map 4 Einträge enthält, wenn die for-Schleife beendet ist.

Was ich tatsächlich sehe, ist, dass irgendwann einer der Einträge der Map überschrieben wird und ich am Ende 3 statt 4 Einträge habe. Was könnte der Grund dafür sein? (Die Schlüssel sind eindeutig, nicht null und nicht in allen Fällen leer)

Vielen Dank im Voraus

EDITAR Schlüssel: Schlüssel nach jeder Iteration gesetzt (sieht perfekt aus, nicht das, was ich bei der Inspektion der Schlüssel im Debugger gesehen habe):

10-16 21:50:01.207: INFO/System.out(27593): ~~~~~~~
10-16 21:50:01.207: INFO/System.out(27593): abc.jpg
10-16 21:50:01.207: INFO/System.out(27593): ~~~~~~~
10-16 21:50:01.217: INFO/System.out(27593): abc.jpg
10-16 21:50:01.217: INFO/System.out(27593): 2010-06-18_12.47.50.jpg
10-16 21:50:01.227: INFO/System.out(27593): ~~~~~~~
10-16 21:50:01.227: INFO/System.out(27593): abc.jpg
10-16 21:50:01.227: INFO/System.out(27593): 2010-06-18_12.47.50.jpg
10-16 21:50:01.227: INFO/System.out(27593): text_0.txt
10-16 21:50:01.237: INFO/System.out(27593): ~~~~~~~
10-16 21:50:01.237: INFO/System.out(27593): abc.jpg
10-16 21:50:01.237: INFO/System.out(27593): text_1.txt
10-16 21:50:01.237: INFO/System.out(27593): 2010-06-18_12.47.50.jpg
10-16 21:50:01.237: INFO/System.out(27593): text_0.txt

2voto

robert_x44 Punkte 9104

Basierend auf Sie zeitgestempelt Debug-Ausgabe korrekt ist, erinnern Sie bitte die folgenden, in Bezug auf die HashMap-Klasse:

Diese Klasse gibt keine Garantie für die Reihenfolge der Karte; insbesondere wird nicht garantiert, dass die Reihenfolge über die Zeit konstant bleibt.

aus der Javadoc: http://download.oracle.com/javase/6/docs/api/java/util/HashMap.html

Im Debugger sah es vielleicht so aus, als ob ein Schlüssel/Wert-Paar überschrieben wurde, aber in Wirklichkeit hat das Einfügen wahrscheinlich die Reihenfolge der HashMap geändert. Das Testen des Rückgabewerts von put(...) ist der beste Weg, um zu prüfen, ob ein neuer Schlüssel/Wert mit einem vorhandenen Schlüssel kollidiert.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X