Java如何在HashMap或HashTable中订购商品?
我想知道Java如何在Map
( HashMap
或Hashtable
)中添加项目时进行订购。 密钥是由哈希码,内存引用还是按分配优先顺序sorting的?
这是因为我注意到在Map
中相同的对不总是在相同的顺序
java.util.HashMap
是无序的; 你不能也不应该承担任何事情。
这个class级不能保证地图的顺序。 特别是不能保证订单会随着时间的推移而保持不变。
java.util.LinkedHashMap
使用插入顺序。
这个实现与
HashMap
不同之处在于它维护一个双向链接列表,它通过所有的条目运行。 这个链表定义了迭代sorting,通常是键被插入映射的顺序(插入顺序)。
SortedMap
java.util.TreeMap
使用键的自然或自定义sorting。
该地图根据其按键的自然顺序或者在地图创build时提供的
Comparator
sorting,具体取决于使用哪个构造函数。
首先: HashMap
没有提供稳定和/或定义的顺序。 所以你所观察到的只是一个实现的细节,你不能以任何方式依赖它。
由于知道表面上随机sorting的原因有时很有用,下面是基本思想:
HashMap
具有存储条目的桶数(实现为数组)。
当一个项目被添加到地图中时,它将根据其hashCode
派生值和HashMap
的桶大小分配给一个桶。 (请注意,桶可能已被占用,这被称为冲突,这是正确和正确的处理,但我会忽略处理描述,因为它不会改变这个概念)。
感知到的sorting(例如通过迭代Map
返回)取决于这些桶中条目的顺序。
每当大小被重新映射(因为映射超过它的充满度阈值),则桶的数量改变,这意味着每个元素的位置可能改变,因为桶位置也是从桶的数量导出的。
HashMap
根本不sorting。 对于按键值sorting的映射,您应该使用TreeMap
。
从JavaDocs的TreeMap
:
SortedMap接口的基于红黑树的实现。 这个类保证了映射按照键的顺序递增,按照键的类的自然顺序sorting(参见Comparable),或者在创build时提供的比较器,这取决于使用哪个构造函数。
从HashMap
的文档:
这个class级不能保证地图的顺序。 特别是不能保证订单会随着时间的推移而保持不变。
一个Map
不是一个有序的数据结构 – 你不应该依赖HashMap
中的条目按照一定的顺序。 一些Map
实现(如LinkedHashMap
和TreeMap
确实保证了一定的顺序,但是HashMap
没有。
如果您真的想知道内部发生了什么,请查找HashMap
的源代码 – 您可以在src.zip中find它,它应该在您的JDK安装目录中。
一个HashMap
有许多“桶”,在其中存储它的条目。 条目存储在哪个桶由条目的键的哈希码确定。 您在HashMap
查看条目的顺序取决于密钥的哈希码。 但是不要编写依赖于HashMap
某些顺序的条目的程序 – 实现可能会在未来的Java版本中发生变化,那么程序就不能工作了。
hashmap有一个未定义的元素顺序
哈希表中没有定义的顺序。 密钥被放置在一个基于散列码的插槽中,但即使这不是一个简单的逐个散列码。
HashMap使用使用部分密钥生成的唯一散列值来存储值。 这个散列值映射到将要存储的地址。 这是如何确保访问O(1)。
另一方面,LinkedHashmap保留了添加到地图的顺序。