我正面临一个微优化,我在 LinkedList 上经常调用contains
。将其更改为 LinkedHashMap ?
注意:我只是添加并检查列表是否包含特定值。
答案 0 :(得分:6)
有点复杂然后“只有LinkedList
平均情况O(1)
包含”,但实质上 - 功能说是。
LinkedHashMap
允许O(1)
包含,并按顺序保留元素 - 与LinkedList
相同。您可能还想查看LinkedHashSet
但,如果您需要重复条目,则可能会遇到问题。 LinkedHashMap
和LinkedHashSet
正在实现Set
和Map
接口,而不是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)
没有; LinkedList
是List
,而LinkedHashMap
是Map
。
除此之外,LinkedHashMap
不保证O(1)包含;事实上,LinkedHashMap.contains
是O(n)。如果使用完美散列或(大致)统一分配密钥到桶(即最佳情况),则可以使用恒定时间contains
,但在具有冲突的情况下,它是具有常数的平均情况线性时间因子0< k < 1。
您似乎想要的是一个插入顺序Set
,其平均效果与HashMap.contains
相当,所以我建议您查看LinkedHashSet。
此实现与
HashSet
的不同之处在于它维护了一个贯穿其所有条目的双向链表。此链接列表定义迭代排序,即元素插入集合的顺序(插入顺序)。