HashMap - правильное использование? - PullRequest
2 голосов
/ 16 октября 2010

Я пытаюсь обработать MMS-сообщение с несколькими вложениями.Для этого я создаю HashMap следующим образом (это не полная реализация, а только соответствующая часть):

    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 */

сообщение, которое я пытаюсь обработать, имеет 4 вложения - два изображения и два текста,поэтому я ожидаю, что хэш-карта будет содержать 4 записи, когда цикл for закончится.

Что я на самом деле вижу, так это то, что в какой-то момент одна из записей карты перезаписывается, и я получаю 3 записи вместо 4. В чем может быть причина?(ключи уникальны, не нулевые и не пустые во всех случаях)

Заранее спасибо

EDIT : ключ устанавливается после каждой итерации (выглядит идеально, не то, что я виделпроверка ключей в отладчике):

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

1 Ответ

2 голосов
/ 17 октября 2010

Исходя из правильности вывода отладки с отметкой времени, пожалуйста, помните следующее относительно класса HashMap:

Этот класс не дает никаких гарантий относительно порядка отображения;в частности, это не гарантирует, что порядок останется постоянным с течением времени.

из javadoc: http://download.oracle.com/javase/6/docs/api/java/util/HashMap.html

В отладчике могло показаться, что пара ключ / значение была перезаписана, но в действительности вставка, вероятно,изменил порядок HashMap.Проверка возвращаемого значения put (...) - лучший способ проверить, сталкивается ли новый ключ / значение с существующим ключом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...