HashMap - 正确用法?

时间:2010-10-16 19:13:40

标签: java android hashmap

我正在尝试处理包含多个附件的彩信。为此,我正在创建一个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个附件 - 两个图像和两个文本,所以我希望当for循环结束时,哈希映射包含4个条目。

我实际看到的是,在某些时候,地图中的一个条目被覆盖,我最终得到3个条目而不是4个。这可能是什么原因? (键是唯一的,不是空的,并且在所有情况下都不是空的)

提前致谢

编辑:每次迭代后的键设置(看起来很完美,而不是我在调试器中看到的检查键):

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 个答案:

答案 0 :(得分:2)

根据您的时间戳调试输出是否正确,请记住以下有关HashMap类:

  

此课程不保证地图的顺序;特别是,它不保证订单会随着时间的推移保持不变。

来自javadoc的

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

在调试器中,它可能看起来像一个键/值对被覆盖,但实际上,插入可能改变了HashMap的顺序。测试put(...)的返回值是测试新键/值是否与现有键冲突的最佳方法。