Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何保持哈希表中元素的顺序_Java_Hashtable_Linkedhashmap - Fatal编程技术网

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

Java 如何保持哈希表中元素的顺序,java,hashtable,linkedhashmap,Java,Hashtable,Linkedhashmap,我有一个哈希表。values()方法以与插入顺序不同的顺序返回值。如何以与插入顺序相同的顺序获取值?使用LinkedHashmap是一种替代方法,但它不同步。哈希表本身就是无序的,因此您使用的数据结构错误。由于您没有指定所使用的语言,因此我无法建议其他语言,但您需要某种类型的有序键/值集。请使用 哈希表和链表 实现Map接口, 具有可预测的迭代顺序。这 实现不同于中的HashMap 它维护一个双链接列表 正在运行它的所有条目。 这个链表定义了迭代 订购,这通常是订单 其中键被插入到 映射(插入顺

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

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

请使用

哈希表和链表 实现
Map
接口, 具有可预测的迭代顺序。这 实现不同于中的
HashMap
它维护一个双链接列表 正在运行它的所有条目。 这个链表定义了迭代 订购,这通常是订单 其中键被插入到 映射(插入顺序)。注意 如果 键被重新插入到地图中。(一) 如果出现以下情况,则将k键重新插入地图m中
m.put(k,v)
m.containsKey(k)
将返回
true
在调用之前。)

结合

例如:

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

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

您可以包装
LinkedHashMap
并进行同步,也可以使用
集合。synchronizedMap
实用程序创建同步:

从JavaDoc:

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


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

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

如果要排序,请使用ConcurrentSkipListMap

您使用的是哪种语言?LinkedHashMap是Java的一部分。性能开销是可以忽略的(毫不夸张地说是纳秒)。澄清一下:如果我不希望一次访问此
LinkedHashMap
,是否仍建议同步它?或者单独使用
LinkedHashMap
就足够了?@blo0p3r单独使用
LinedHashMap
就足够了。
Map m = Collections.synchronizedMap(new LinkedHashMap(...));