散列和索引列表或数组?

时间:2012-05-23 09:20:59

标签: java vector hashmap

Java中是否有任何类,它按顺序包含一系列元素并针对快速搜索进行优化?

即。我需要通过数字索引(如Vector)和哈希(如HashMap)检索元素。

LinkedHashMap不匹配

我认为LinkedHashMap不匹配,因为它保证顺序,但不允许按索引(位置编号)快速访问。根据描述,将需要遍历整个链以找到给定位置。这是任何Collection可以使用迭代器。

编辑2

即。按键和索引搜索都应该很快,不仅仅是按键。

4 个答案:

答案 0 :(得分:2)

您可以使用Map通过哈希快速检索元素。根据定义,Map是无序的,谈论索引没有多大意义。使用LinkedHashMap可能是有用的,因为它保证在迭代时保留插入顺序,尽管按索引访问元素仍然需要一些额外的处理,如下所示:

map.entrySet().toArray()[index] // mind the casts, etc.

如果您的地图不经常更改,如果您缓存数组并在按索引访问条目之前检查地图的大小是否已更改,则上述内容将很好地工作,只有在大小发生变化时才创建新数组检测。另一方面,如果地图频繁更改,则需要在每次访问时重新创建数组,从而创建性能较差的数据结构。

答案 1 :(得分:2)

我认为你可以试试LinkedHashSet

答案 2 :(得分:1)

使用 LinkedHashMap 。这将允许您通过键检索元素。此外,您还可以按照存储在其中的相同顺序检索元素。

答案 3 :(得分:1)

我认为你正在寻找LinkedHashMap

来自文档:

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