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

Pab*_*lgo 8 java hashmap data-structures

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

您可以在java文档中Object阅读有关该Object方法的信息hashCode.

我知道从那里hashCode上课的实施,如String和基本类型包装(Integer,Long一旦对象所包含的值给出,...)是可以预见的.例如,hashCodeString包含该值的任何对象的调用hello应始终返回:99162322

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

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

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

Ale*_*lev 6

据我所知,values()HashMap执行map rehash之前,保持元素的顺序(假设我们称之为"order",迭代器返回的元素的顺序).我们可以通过提供capacity和/或loadFactor构造函数来影响该事件的概率.

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