首先,我想明确表示我永远不会使用HashMap来处理数据结构中需要某种顺序的事情,并且这个问题是由我对Java HashMap实现的内部细节的好奇心所驱动的。
您可以在java documentation on Object
中了解Object
方法hashCode
。
我从那里了解到,hashCode
等类的String
实现和基本类型包装器(Integer
,Long
,...)在包含的值后是可预测的由对象给出。例如,对包含值hashCode
的任何String
对象的hello
调用应始终返回:99162322
具有始终插入空Java HashMap的算法,其中String
被用作相同顺序的相同值的键。那么,它最后元素的顺序应该是一样的,我错了吗?
由于具体值的哈希码始终相同,如果没有冲突,则顺序应该相同。 另一方面,如果存在碰撞,我认为(我不知道事实)碰撞分辨率应该对完全相同的输入元素产生相同的顺序。
那么,具有相同元素的两个HashMap对象是否应该遍历(通过迭代器)给出相同的元素序列,这不是正确的吗?
答案 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。