How to keep the order of elements in hashtable

╄→尐↘猪︶ㄣ 提交于 2019-11-27 23:29:43
cletus

Use a LinkedHashMap.

Hash table and linked list implementation of the Map interface, with predictable iteration order. This implementation differs from HashMap in that it maintains a doubly-linked list running through all of its entries. This linked list defines the iteration ordering, which is normally the order in which keys were inserted into the map (insertion-order). Note that insertion order is not affected if a key is re-inserted into the map. (A key k is reinserted into a map m if m.put(k, v) is invoked when m.containsKey(k) would return true immediately prior to the invocation.)

combined with Collections.synchronizedMap().

So, for example:

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

You could either wrap a LinkedHashMap and synchronize or you could use the Collections.synchronizedMap utility to create a synchronized LinkedHashMap:

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

From the JavaDoc:

If multiple threads access a linked hash map concurrently, and at least one of the threads modifies the map structurally, it must be synchronized externally. This is typically accomplished by synchronizing on some object that naturally encapsulates the map. If no such object exists, the map should be "wrapped" using the Collections.synchronizedMap method. This is best done at creation time, to prevent accidental unsynchronized access to the map

I'm pretty sure that the reason hashtables are unsorted is to aid storage and retrieval speed. Because of this I would suggest using an external structure to maintain ordering and just using the hashtable for storing values (for fast lookup).

A hash table is inherently unordered, so you are using the wrong data structure. Since you don't specify what language you are using I cannot suggest an alternate, but you need some type of ordered key/value set.

If jdk1.6 you have only two type of ordered map EnumMap and LinkedHashMap. Both of them are not synchronized. If you just need to remember the order, use

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

if you want sorted then use ConcurrentSkipListMap

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!