Java如何对HashMap或HashTable中的项目进行排序?

2022-08-31 16:18:50

我想知道Java在添加时如何对( 或 )中的项目进行排序。密钥是按哈希码、内存引用还是按分配优先级排序...?MapHashMapHashtable

这是因为我注意到相同的对并不总是以相同的顺序排列。Map


答案 1

java.util.HashMap 是无序的;你不能也不应该假设任何超出这个范围的东西。

此类不保证映射的顺序;特别是,它不保证订单将随着时间的推移而保持不变。

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

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

java.util.TreeMap,一个排序的地图,使用键的自然或自定义排序。

地图根据其键的自然排序进行排序,或按地图创建时提供的进行排序,具体取决于所使用的构造函数。Comparator


答案 2

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

由于有时知道看似随机排序的原因很有用,因此以下是基本思想:

A 具有许多用于存储条目的存储桶(作为数组实现)。HashMap

将项目添加到地图时,将根据其派生的值和 存储桶大小的将该项目分配给存储桶。(请注意,存储桶可能已被占用,这称为冲突。这处理得优雅而正确,但我会忽略描述的处理,因为它不会改变概念)。hashCodeHashMap

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

每当重新哈希大小时(因为映射超过了其丰满度阈值),则存储桶的数量会发生变化,这意味着每个元素的位置可能会发生变化,因为存储桶位置也是从存储桶的数量派生的。