LinkedHashMap基本上是一个带有O(1)'包含'的LinkedList吗?

时间:2012-08-07 08:03:55

标签: java list

我正面临一个微优化,我在 LinkedList 上经常调用contains。将其更改为 LinkedHashMap

是不是一个好主意

注意:我只是添加并检查列表是否包含特定值。

3 个答案:

答案 0 :(得分:6)

有点复杂然后“只有LinkedList平均情况O(1)包含”,但实质上 - 功能说是。

LinkedHashMap允许O(1)包含,并按顺序保留元素 - 与LinkedList相同。您可能还想查看LinkedHashSet

,如果您需要重复条目,则可能会遇到问题。 LinkedHashMapLinkedHashSet正在实现SetMap接口,而不是List接口,因此它们不允许重复。

答案 1 :(得分:0)

是的,LinkedHashMap提供O(1)成员资格检查

  

与HashMap一样,它为基本操作(添加,包含和删除)提供了恒定时间性能,假设哈希函数在桶之间正确地分散元素。

另请注意

  

由于维护链表的额外费用,性能可能略低于HashMap的性能,但有一个例外:对LinkedHashMap的集合视图进行迭代需要与地图大小成比例的时间,无论如何它的能力。对HashMap的迭代可能更昂贵,需要与其容量成比例的时间。

http://docs.oracle.com/javase/6/docs/api/java/util/LinkedHashMap.html

如果您不需要可预测的排序,HashMap在插入/修改时会稍微快一些,因为它不需要维护链表以保持排序。

答案 2 :(得分:0)

没有; LinkedListList,而LinkedHashMapMap

除此之外,LinkedHashMap 保证O(1)包含;事实上,LinkedHashMap.contains是O(n)。如果使用完美散列或(大致)统一分配密钥到桶(即最佳情况),则可以使用恒定时间contains,但在具有冲突的情况下,它是具有常数的平均情况线性时间因子0< k < 1。

您似乎想要的是一个插入顺序Set,其平均效果与HashMap.contains相当,所以我建议您查看LinkedHashSet

  

此实现与HashSet的不同之处在于它维护了一个贯穿其所有条目的双向链表。此链接列表定义迭代排序,即元素插入集合的顺序(插入顺序)。