HashMap元素的顺序是否可重现?

时间:2014-04-02 13:28:22

标签: java data-structures hashmap

首先,我想明确表示我永远不会使用HashMap来处理数据结构中需要某种顺序的事情,并且这个问题是由我对Java HashMap实现的内部细节的好奇心所驱动的。

您可以在java documentation on Object中了解Object方法hashCode

我从那里了解到,hashCode等类的String实现和基本类型包装器(IntegerLong,...)在包含的值后是可预测的由对象给出。例如,对包含值hashCode的任何String对象的hello调用应始终返回:99162322

具有始终插入空Java HashMap的算法,其中String被用作相同顺序的相同值的键。那么,它最后元素的顺序应该是一样的,我错了吗?

由于具体值的哈希码始终相同,如果没有冲突,则顺序应该相同。 另一方面,如果存在碰撞,我认为(我不知道事实)碰撞分辨率应该对完全相同的输入元素产生相同的顺序。

那么,具有相同元素的两个HashMap对象是否应该遍历(通过迭代器)给出相同的元素序列,这不是正确的吗?

3 个答案:

答案 0 :(得分:6)

据我所知,values()中元素的顺序(假设我们称之为“order”,HashMap迭代器返回的元素的顺序)将被保留,直到执行map rehash。我们可以通过向构造函数提供capacity和/或loadFactor来影响该事件的概率。

尽管如此,我们绝不应该依赖这一陈述,因为HashMap的内部实施不是其公共合同的一部分,并且将来可能会发生变化。

答案 1 :(得分:2)

我认为你在问“HashMap是否具有非确定性?”。答案是“可能不是”(查看您最喜欢的实现的源代码以查找)。

但是,请记住,因为Java标准不保证特定的顺序,所以实现可以随时更改(例如在较新的JRE版本中),从而给出不同的(但确定的)结果。

答案 2 :(得分:0)

这是否真实完全取决于实施。更重要的是它不能得到保证。如果您的订单对您很重要,那么您可以选择。您可以创建自己的Map实现,它可以保留顺序,您可以使用SortedMap / LinkedHashMap,也可以使用类似apache commons-collections OrderedMap:http://commons.apache.org/proper/commons-collections/javadocs/api-release/org/apache/commons/collections4/OrderedMap.html