HashMap的元素顺序错误

Wah*_*saw 3 java hashmap

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

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

Apple Fruit
PC    Device
Pen   Tool
...
Run Code Online (Sandbox Code Playgroud)

而代码是

    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;
    }
Run Code Online (Sandbox Code Playgroud)

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

        for (Map.Entry<Integer, String> token:tokens.entrySet())
    {
        System.out.println(token.getKey() + token.getValue());
    }
Run Code Online (Sandbox Code Playgroud)

我得到了以下内容

1   Apple
3   Pen
4   whatever
2   ..etc
Run Code Online (Sandbox Code Playgroud)

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

SLa*_*aks 16

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

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


Ale*_*s G 6

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

编辑:感谢那些提出这个问题的人:TreeMap将项目保持在自然排序顺序中(即按字母顺序排列). LinkedHashMap将保留插入顺序.