我有一个哈希表。values()方法返回的值的顺序与我插入的顺序不同。如何以插入顺序获取这些值?使用LinkedHashmap是一种替代方案,但它不是同步的。
我有一个哈希表。values()方法返回的值的顺序与我插入的顺序不同。如何以插入顺序获取这些值?使用LinkedHashmap是一种替代方案,但它不是同步的。
Map
接口的哈希表和链表实现,具有可预测的迭代顺序。此实现与HashMap
不同之处在于,它维护通过所有条目的双向链接列表。此链接列表定义了迭代顺序,通常是将键插入到映射中的顺序(即“插入顺序”)。请注意,如果将键重新插入到映射中,则不会影响插入顺序。(如果在调用m.put(k, v)
之前立即调用m.containsKey(k)
将返回true
,则称键k被重新插入到映射m中。)
结合Collections.synchronizedMap()
使用。
例如:
Map<String, String> map = Collections.synchronizedMap(
new LinkedHashMap<String, String>());
LinkedHashMap
,那么是否仍建议对其进行同步?还是说LinkedHashMap
本身就足够了? - blo0p3rLinedHashMap
本身应该足够了。 - Priidu Neemre您可以将LinkedHashMap
进行包装并同步,或者使用Collections.synchronizedMap
实用程序创建一个同步的LinkedHashMap
:
Map m = Collections.synchronizedMap(new LinkedHashMap(...));
根据JavaDoc:
如果多个线程同时访问一个链接哈希映射,并且其中至少一个线程在结构上修改了该映射,则必须在外部进行同步。通常通过在自然地封装映射的某个对象上同步来实现这一点。如果不存在这样的对象,则应使用Collections.synchronizedMap方法“包装”映射。最好在创建时完成此操作,以防止意外的非同步访问映射。
我相信哈希表不排序的原因是为了提高存储和检索速度。因此,我建议使用外部结构来维护顺序,只使用哈希表来存储值(以实现快速查找)。
哈希表本质上是无序的,所以您使用了错误的数据结构。由于您没有指定使用的语言,我无法建议替代方案,但您需要一些类型的有序键/值集合。
Map m = Collections.synchronizedMap(new LinkedHashMap(...));