如何在哈希表中保持元素的顺序

时间:2009-09-14 04:42:08

标签: java hashtable linkedhashmap

我有一个哈希表。 values()方法以不同于我插入顺序的顺序返回值。如何以与插入时相同的顺序获取值?使用LinkedHashmap是一种替代方法,但它不是同步的。

5 个答案:

答案 0 :(得分:34)

使用LinkedHashMap

  

哈希表和链表   实现Map接口,   具有可预测的迭代顺序。这个   实现与HashMap的不同之处   它保持一个双向链表   贯穿其所有条目。   此链接列表定义迭代   订购,通常是订单   其中键被插入   map(插入顺序)。注意   如果a,插入顺序不受影响   密钥重新插入到地图中。 (一个   如果将密钥k重新插入到映射中   在调用时调用m.put(k, v)   m.containsKey(k)将返回true   在调用之前。)

结合Collections.synchronizedMap()

所以,例如:

Map<String, String> map = Collections.synchronizedMap(
  new LinkedHashMap<String, String>());

答案 1 :(得分:4)

您可以打包LinkedHashMap并进行同步,也可以使用Collections.synchronizedMap实用程序创建同步LinkedHashMap

Map m = Collections.synchronizedMap(new LinkedHashMap(...));

来自JavaDoc:

  

如果多个线程同时访问链接的哈希映射,并且至少有一个线程在结构上修改了映射,则必须在外部进行同步。这通常通过在自然封装地图的某个对象上进行同步来实现。如果不存在此类对象,则应使用Collections.synchronizedMap方法“包装”该映射。这最好在创建时完成,以防止意外地不同步访问地图

答案 2 :(得分:2)

我很确定散列表未分类的原因是为了帮助存储和检索速度。因此,我建议使用外部结构来维护排序,并使用哈希表来存储值(用于快速查找)。

答案 3 :(得分:1)

哈希表本质上是无序的,因此您使用的是错误的数据结构。由于您没有指定使用的语言,因此无法建议替代语言,但您需要某种类型的有序键/值集。

答案 4 :(得分:1)

如果jdk1.6只有两种类型的有序映射EnumMap和LinkedHashMap。它们都不同步。如果您只需要记住订单,请使用

Map m = Collections.synchronizedMap(new LinkedHashMap(...));

如果你想要排序,那么使用ConcurrentSkipListMap