25

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

4

5 回答 5

36

使用LinkedHashMap.

接口的哈希表和链表实现Map,具有可预测的迭代顺序。此实现的不同之处HashMap在于它维护一个贯穿其所有条目的双向链表。这个链表定义了迭代顺序,通常是键插入映射的顺序(插入顺序)。请注意,如果将键重新插入到地图中,则插入顺序不会受到影响。(如果 m.put(k, v)调用 when 将 在调用之前立即m.containsKey(k)返回,则将键 k 重新插入到映射 m 中。)true

结合Collections.synchronizedMap().

因此,例如:

Map<String, String> map = Collections.synchronizedMap(
  new LinkedHashMap<String, String>());
于 2009-09-14T04:47:08.557 回答
4

您可以包装 aLinkedHashMap并 synchronize ,也可以使用该Collections.synchronizedMap实用程序创建 synchronized LinkedHashMap

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

来自 JavaDoc:

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

于 2009-09-14T04:49:29.457 回答
3

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

于 2009-09-14T04:47:27.403 回答
2

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

于 2009-09-14T04:46:02.727 回答
1

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

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

如果要排序,请使用 ConcurrentSkipListMap

于 2009-10-23T19:17:10.957 回答