一般来说,HashMap实现是无序迭代的。
LinkedHashMap可以预测为迭代(插入顺序)排序,但不会暴露List接口和LinkedList(这是镜像密钥集插入顺序)也不会跟踪索引位置本身,因此找到索引非常有效好。 LinkedHashMap也不会公开对内部LinkedList的引用。
The actual “Linked List” behavior is implementation specific. Some
may actually use an instance of LinkedList some many just have
Entry track a previous and next Entry and use that as its
implementation. Don’t assume anything without looking at the source.
包含密钥的KeySet不能保证顺序,因为用于放置在继承的HashMap的后台数据结构中的散列算法。所以你不能使用它。
执行此操作的唯一方法是,无需编写自己的实现,就是使用使用镜像LinkedList的Iterator,并保持计数,这将大大降低数据集的效率。
解
听起来像你想要的是原始的插入顺序索引位置,你必须镜像KeySet中的键,像一个ArrayList,保持与HashMap的更新同步,并使用它来查找位置。创建HashMap的子类,例如IndexedHashMap,并在内部添加该ArrayList,并添加一个委托给内部ArrayList.exexOf()的.getKeyIndex(< K>键),这是最好的方式。
这是LinkedHashMap所做的,但是使用LinkedList镜像KeySet而不是ArrayList。