关于java:HashMap弄乱了自己元素的顺序

HashMap messes up the order of its own elements

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

简单的标题,我已经搜索过了,我没有找到关于这个问题的任何内容,我很确定我只是误解了HashMap如何使用自己的元素。
超级简单的代码:

1
2
3
4
5
6
HashMap<String, Integer> map = new HashMap<String, Integer>();
    map.put("first key", 1);
    map.put("second key", 2);
    map.put("third key", 3);

    System.out.println(map.toString());

println()方法显示什么?
它显示了这个:

1
{third key=3, first key=1, second key=2}

当程序员把它们放入时,我强调了HashMap存储的元素。
即使是排序也会将这些元素放在原点上。
我尝试改变单词和类似的事情发生(只有位置改变了,但无论如何它们都是"错误的")。:/
你知道为什么吗?

提前致谢 :/

编辑:Rohit Jain实际上是第一个回答我评论的人,你们告诉我关于LinkedHashMap的事情,所以你帮我解决了,非常感谢你:)


如果要按插入顺序迭代键,则需要使用LinkedHashMapHashMap文档清楚地说明了这一点

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.


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

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


HashMap不保证任何类型的订购。

来自java文档:

This class makes no guarantees as to the order of the map

如果要维护订单,可以使用LinkedHashMap。


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

你想要LinkedHashMap:

1
2
3
4
5
6
    LinkedHashMap<String, Integer> map = new LinkedHashMap<String, Integer>();
    map.put("first key", 1);
    map.put("second key", 2);
    map.put("third key", 3);

    System.out.println(map.toString());

输出:

1
{first key=1, second key=2, third key=3}

如果你关心的只是toString,你也可以使用TreeMap。


您正在寻找保留插入订单的LinkedHashMap


有不同的Map类型,对其键顺序给出不同的保证(见此)。

HashMap:元素的未定义排序。

LinkedHashMap:由插入定义的顺序。

TreeMap:由元素的compareTo()方法定义的顺序。

因此,HashMap不保证它的迭代顺序。插入另一个元素后,您将获得不同的顺序。根据您的描述,LinkedHashMap可能就是您所需要的。