我知道所有这些内容之间存在差异,并且我了解LinkedHashMap
和LinkedHashSet
提供了插入顺序。我理解LinkedHashMap extends HashMap
和LinkedHashSet extends HashSet
。
为什么我们不总是使用LinkedHashMap
代替HashMap
,为什么我们不总是使用LinkedHashSet
代替HashSet
?
答案 0 :(得分:9)
保持插入顺序有相关的成本,无论是需要更多内存还是花费额外的CPU周期:
虽然渐近复杂度是相同的,但增加的便利性并不是免费的。如果您不需要维护订单,则无需支付&#34;支付&#34;对于它,并使用较轻的HashSet<E>
和HashMap<K,V>
代替。
答案 1 :(得分:2)
订购是以LinkedhashMap / LinkedHashSet中的效率为代价的。因此,每当我们不需要Ordering时,我们就可以使用hashMap / HashSet。
答案 2 :(得分:0)
关于成本的其他答案是正确的,但只是为了澄清为什么这很重要(这将是一个更好的评论,但它会太长。)
不管你信不信,Java是一种非常低级的语言,就CPU来说而言。它确实占用了一点内存,但如果你正确使用它,它可以执行非常接近C(通常是速度的1/2,有时几乎是1:1,具体取决于任务)。这与Python这样的语言相反,它的速度相当于C和Ruby的1/10速度,而不是qhick(C / C的速度的1 / 50-1 / 100)在易用性方面,Java可以用作非常高级的语言,仅用Java实现大型Web解决方案。
对于大多数高级解决方案,您的观察非常准确 - LinkedHashMap几乎不会对HashMap产生影响,但对于低级别,快速运行的应用程序(在小规模上认为MineCraft实时图形 - - 或大规模考虑谷歌的分布式网络集群。在这些情况下,您可以像在C中编写一样进行编程。您可以消除内存分配并写入非常接近金属的位置以获得速度。
Java非常努力地总是允许&#34; Fast&#34;解决方案,这是Java和许多后代语言之间最大的差异之一 - 尽可能优化(或至少可以优化)每一点Java。
作为一个具体的例子 - twitter最初是在Ruby on Rails中实现的。当它归结为它时,lanuge的速度不够快(尽管这可能是Twitters成功的原因 - 更容易让它在第一时间运行起来!!)。当他们用Java取代ROR时,他们能够消除9/10的服务器并获得更好的吞吐量。