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

我想知道Java如何在MapHashMapHashtable )中添加项目时进行订购。 密钥是由哈希码,内存引用还是按分配优先顺序sorting的?

这是因为我注意到在Map中相同的对不总是在相同的顺序

java.util.HashMap是无序的; 你不能也不应该承担任何事情。

这个class级不能保证地图的顺序。 特别是不能保证订单会随着时间的推移而保持不变。

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

这个实现与HashMap不同之处在于它维护一个双向链接列表,它通过所有的条目运行。 这个链表定义了迭代sorting,通常是键被插入映射的顺序(插入顺序)。

SortedMap java.util.TreeMap使用键的自然或自定义sorting。

该地图根据其按键的自然顺序或者在地图创build时提供的Comparatorsorting,具体取决于使用哪个构造函数。

首先: HashMap 没有提供稳定和/或定义的顺序。 所以你所观察到的只是一个实现的细节,你不能以任何方式依赖它。

由于知道表面上随机sorting的原因有时很有用,下面是基本思想:

HashMap具有存储条目的桶数(实现为数组)。

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

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

每当大小被重新映射(因为映射超过它的充满度阈值),则桶的数量改变,这意味着每个元素的位置可能改变,因为桶位置也是从桶的数量导出的。

HashMap根本不sorting。 对于按键值sorting的映射,您应该使用TreeMap

从JavaDocs的TreeMap

SortedMap接口的基于红黑树的实现。 这个类保证了映射按照键的顺序递增,按照键的类的自然顺序sorting(参见Comparable),或者在创build时提供的比较器,这取决于使用哪个构造函数。

HashMap的文档:

这个class级不能保证地图的顺序。 特别是不能保证订单会随着时间的推移而保持不变。

一个Map不是一个有序的数据结构 – 你不应该依赖HashMap中的条目按照一定的顺序。 一些Map实现(如LinkedHashMapTreeMap确实保证了一定的顺序,但是HashMap没有。

如果您真的想知道内部发生了什么,请查找HashMap的源代码 – 您可以在src.zip中find它,它应该在您的JDK安装目录中。

一个HashMap有许多“桶”,在其中存储它的条目。 条目存储在哪个桶由条目的键的哈希码确定。 您在HashMap查看条目的顺序取决于密钥的哈希码。 但是不要编写依赖于HashMap某些顺序的条目的程序 – 实现可能会在未来的Java版本中发生变化,那么程序就不能工作了。

hashmap有一个未定义的元素顺序

哈希表中没有定义的顺序。 密钥被放置在一个基于散列码的插槽中,但即使这不是一个简单的逐个散列码。

HashMap使用使用部分密钥生成的唯一散列值来存储值。 这个散列值映射到将要存储的地址。 这是如何确保访问O(1)。

另一方面,LinkedHashmap保留了添加到地图的顺序。