繁体   English   中英

LinkedHashMap基本上是具有O(1)“包含”的LinkedList吗?

[英]Is a LinkedHashMap basically a LinkedList with O(1) 'contains'?

我现在面临一个微型优化,其中我打电话contains frequenly上一个LinkedList。 将其更改为LinkedHashMap是一个好主意吗?

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

它比“仅具有平均大小写O(1)包含的LinkedList ”要复杂得多,但是从本质上讲-功能是肯定的。

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

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

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

像HashMap一样,它假定哈希函数将元素正确分散在存储桶中,从而为基本操作(添加,包含和删除)提供恒定时间的性能。

另请注意

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

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

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

没有; LinkedListList ,而LinkedHashMapMap

除此之外, LinkedHashMap 不能保证O(1)包含; 实际上, LinkedHashMap.contains是O(n)。 如果使用完美的散列或将键(大致)均匀分布到存储桶(即最佳情况),则可以使用恒定时间contains ,但是在发生冲突的情况下,它是平均情况下的线性时间,且常数因子0 < k <1。

您似乎想要的是具有平均大小写性能与HashMap.contains相当的插入顺序Set ,因此建议您查看LinkedHashSet

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM