关于java:HashMap的元素顺序错误

elements of HashMap are in the wrong order

本问题已经有最佳答案,请猛点这里访问。

我需要从文件中读取两列(都是String),并将第一列的值保存在HashMap中,其中Integer是计数器。

例如,如果我正在阅读的文件是

1
2
3
4
Apple Fruit
PC    Device
Pen   Tool
...

而代码是

1
2
3
4
5
6
7
8
9
10
    String line="";
    int counter=1;
BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream("test.txt"),"Unicode"));
    while ((line = reader.readLine()) != null)
    {
        String[] words;
        words= st.split("");
            tokens.put(counter, words[0]);
        counter+=1;
    }

问题是当我打印HashMap值时,我发现值与origianl文件中的值的顺序不同

1
2
3
4
        for (Map.Entry<Integer, String> token:tokens.entrySet())
    {
        System.out.println(token.getKey() + token.getValue());
    }

我得到了以下内容

1
2
3
4
1   Apple
3   Pen
4   whatever
2   ..etc

我不知道是什么问题?! 你可以帮助我吗?


正如文档明确指出的那样,HashMaps是无序的。
枚举顺序由键的hascodes

如果要在枚举地图时保留插入顺序,请使用LinkedHashMap
如果您希望枚举顺序遵循键的自然顺序,请使用TreeMap


HashMap未订购。您无法控制项目的显示顺序。如果您需要有序地图,则可以使用TreeMap

编辑:感谢那些提出这一点:TreeMap将项目保持自然排序顺序(即在您的情况下按字母顺序)。 LinkedHashMap将保留插入顺序。


HashMap不是有序的Collection。 (它甚至不是Collection)它更像是一本字典。

如果您想要遵守项目的顺序,可以使用TreeMapLinkedHashMap

它们之间的区别在于TreeMap按照自然排序顺序对它们进行排序,而LinkedHashMap保持插入顺序。

在大多数情况下,您希望使用List之类的东西,您可以使用LinkedHashMap

TreeMap使用红黑树进行内部实现,而LinkedHashMap使用双向链表。

我的建议是你应该参考官方文档。在那里你会找到彻底的解释。

此外,迭代Map s的惯用方法是:

1
2
3
4
for(Integer key : map.keySet()) {
    String myString = map.get(key);
    // ...
}

如果要返回插入顺序,请使用LinkedHashMap。默认情况下,HashMap的迭代器不保证插入顺序。