如何在哈希表中保持元素的顺序
我有一个哈希表。 values()方法以某种顺序返回值,这些顺序与我插入的顺序不同。如何以与插入时相同的顺序获取值?使用LinkedHashmap是一种替代方法,但它不是同步的。
使用LinkedHashMap
。
Map
接口的哈希表和链表实现,具有可预测的迭代顺序。 此实现与HashMap
不同之处在于它维护了一个贯穿其所有条目的双向链表。 此链接列表定义迭代排序,通常是键插入映射的顺序 ( 插入顺序 )。 请注意,如果将键重新插入地图,则不会影响插入顺序。 (如果m.put(k, v)
在调用之前立即返回true
m.put(k, v)
则调用m.put(k, v)
时m.put(k, v)
将密钥k重新插入到映射m中。)
与Collections.synchronizedMap()
结合使用。
所以,例如:
Map map = Collections.synchronizedMap( new LinkedHashMap());
您可以包装LinkedHashMap
并进行同步,也可以使用Collections.synchronizedMap
实用程序创建同步的LinkedHashMap
:
Map m = Collections.synchronizedMap(new LinkedHashMap(...));
来自JavaDoc:
如果多个线程同时访问链接的哈希映射,并且至少有一个线程在结构上修改了映射,则必须在外部进行同步。 这通常通过在自然封装地图的某个对象上进行同步来实现。 如果不存在此类对象,则应使用Collections.synchronizedMap方法“包装”该映射。 这最好在创建时完成,以防止意外地不同步访问地图
我很确定散列表未分类的原因是为了帮助存储和检索速度。 因此,我建议使用外部结构来维护排序,并使用哈希表来存储值(用于快速查找)。
哈希表本质上是无序的,因此您使用了错误的数据结构。 由于您未指定使用的语言,因此无法建议备用语言,但您需要某种类型的有序键/值集。
如果jdk1.6只有两种类型的有序映射EnumMap和LinkedHashMap。 它们都不同步。 如果您只需要记住订单,请使用
Map m = Collections.synchronizedMap(new LinkedHashMap(...));
如果要排序,则使用ConcurrentSkipListMap