Java如何在HashMap或HashTable中订购商品?

Eya*_*lah 60 java hashtable hashmap map hashcode

我想知道Java如何在Map(HashMapHashtable)添加项目时订购项目.键是由哈希码,内存引用还是按分配优先级排序的?

这是因为我注意到它们中的相同对Map并不总是在同一个顺序中

pol*_*nts 122

java.util.HashMap是无序的; 你不能也不应该假设任何事情.

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

java.util.LinkedHashMap 使用插入顺序.

这种实现的不同之处HashMap在于它维护了一个贯穿其所有条目的双向链表.此链接列表定义迭代排序,通常是键插入映射的顺序(插入顺序).

java.util.TreeMap,a SortedMap,使用键的自然或自定义顺序.

地图根据其键的自然顺序进行排序,或者Comparator根据使用的构造函数在地图创建时提供.

  • 但每次Hashmap都遵循相同的可预测序列......为什么? (2认同)

Joa*_*uer 18

首先:HashMap特别是不提供稳定和/或定义的排序.因此,您观察到的任何内容都只是一个实现细节,您不能以任何方式依赖它.

因为知道看似随机排序的原因有时很有用,所以这里是基本的想法:

A HashMap具有用于存储条目的多个桶(实现为阵列).

当一个项目被添加到地图时,它会根据从其派生的值hashCode和其中的桶大小分配给存储桶HashMap.(请注意,存储桶可能已被占用,这称为冲突.这是优雅且正确的处理,但我会忽略对描述的处理,因为它不会改变概念).

entires的感知排序(例如通过迭代返回Map)取决于这些桶中条目的顺序.

每当重新定义大小时(因为地图超过其丰满度阈值),则桶的数量改变,这意味着每个元素的位置可能改变,因为桶位置也是从桶的数量导出的.


Lam*_*bda 5

HashMap根本不排序.对于按键值排序的地图,您应该使用TreeMap.

来自JavaDocs TreeMap:

基于Red-Black树的SortedMap接口实现.此类保证映射将按升序键顺序排序,根据键类的自然顺序(请参阅Comparable)进行排序,或者根据创建时提供的比较器进行排序,具体取决于使用的构造函数.

来自以下文件HashMap:

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