我有一个哈希表。values() 方法以与插入顺序不同的顺序返回值。如何以与插入顺序相同的顺序获取值?使用 LinkedHashmap 是一种替代方法,但它不同步。
5 回答
接口的哈希表和链表实现
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>());
您可以包装 aLinkedHashMap
并 synchronize ,也可以使用该Collections.synchronizedMap
实用程序创建 synchronized LinkedHashMap
:
Map m = Collections.synchronizedMap(new LinkedHashMap(...));
来自 JavaDoc:
如果多个线程同时访问链接的哈希映射,并且至少有一个线程在结构上修改映射,则必须在外部同步。这通常是通过同步一些自然封装地图的对象来完成的。如果不存在这样的对象,则应使用 Collections.synchronizedMap 方法“包装”地图。这最好在创建时完成,以防止对地图的意外不同步访问
我很确定哈希表未排序的原因是为了提高存储和检索速度。因此,我建议使用外部结构来维护排序并仅使用哈希表来存储值(用于快速查找)。
哈希表本质上是无序的,因此您使用了错误的数据结构。由于您没有指定您使用的语言,我无法建议替代,但您需要某种类型的有序键/值集。
如果 jdk1.6 你只有两种类型的有序映射 EnumMap 和 LinkedHashMap。两者都不同步。如果您只需要记住顺序,请使用
Map m = Collections.synchronizedMap(new LinkedHashMap(...));
如果要排序,请使用 ConcurrentSkipListMap