java - HashMap - 正确用法?

标签 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 个条目。

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

提前致谢

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

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

最佳答案

基于您带时间戳的调试输出是正确的,请记住以下关于 HashMap 类的内容:

This class makes no guarantees as to the order of the map; in particular, it does not guarantee that the order will remain constant over time.

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

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

关于java - HashMap - 正确用法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3950366/

相关文章:

Java:如何在未修饰的 JFrame 周围绘制边框?

android - 声音不在播放Android程序的声音中播放

javascript - 与在 JavaScript 中使用 Map 相比,实现 HashMap 有什么优势?

java - 计算有多少个 HashMap 条目具有给定值

java - 如何解析此 JSON 对象以获取可以使用的配方对象列表?

java - 如何直接从 Jenkins 启动 Chrome 浏览器而不是在 Eclipse 中使用代码

Android SDK安装失败,找不到java版本

android - Jetpack 在深色模式下撰写 TextField 文本颜色

java - 为什么我会收到此错误 "FirebaseRecyclerAdapter() in FirebaseRecyclerAdapter cannot be applied to:"

java - 在这种情况下我将如何正确使用数组?