我知道它们之间的区别,我理解这一点LinkedHashMap
并LinkedHashSet
提供插入排序。我理解LinkedHashMap extends HashMap
和LinkedHashSet extends HashSet
。
为什么我们不总是使用LinkedHashMap
代替,HashMap
为什么我们不总是使用LinkedHashSet
代替HashSet
?
我知道它们之间的区别,我理解这一点LinkedHashMap
并LinkedHashSet
提供插入排序。我理解LinkedHashMap extends HashMap
和LinkedHashSet extends HashSet
。
为什么我们不总是使用LinkedHashMap
代替,HashMap
为什么我们不总是使用LinkedHashSet
代替HashSet
?
保持插入顺序有其相关成本,包括需要更多内存和花费额外的 CPU 周期:
尽管渐近复杂度是相同的,但增加的便利性并不是免费的。如果您不需要维护广告订单,则不必为它“付费”,而是使用更轻量级的HashSet<E>
andHashMap<K,V>
代替。
在 LinkedhashMap / LinkedHashSet 中,排序是以效率为代价的。因此,当我们不需要 Ordering 时,我们可以使用 hashMap / HashSet。
关于成本的其他答案是正确的,但只是为了澄清为什么这很重要(这将是一个更好的评论,但它会太长。)
信不信由你,就 CPU 而言,Java 是一种非常低级的语言。它确实占用了一些内存,但如果你正确使用它,它可以执行非常接近 C 的性能(通常是速度的 1/2,有时接近 1:1,具体取决于任务)。这与像 Python 这样的语言相反,它的速度是 C 的 1/10,而 Ruby 不是那么快(C 的速度的 1/50-1/100)
但就易用性而言,Java 可以用作一种非常高级的语言,仅用 Java 就可以实现巨大的 Web 解决方案。
对于大多数高级解决方案,您的观察是相当准确的——LinkedHashMap 对 HashMap 几乎没有影响,但对于低级、快速运行的应用程序(在小规模上考虑 MineCraft 实时图形——或大规模考虑 Google 的分布式 Web 集群)。在这些情况下,您可以像使用 C 语言一样进行编程。您消除了内存分配并非常接近于金属进行编写,以获得每一点速度。
Java 非常努力地始终允许“快速”解决方案,这是 Java 和许多后代语言之间最大的区别之一——Java 的每一点都尽可能地优化(或至少是可优化的)。
作为一个具体的例子——twitter 最初是在 Ruby on Rails 中实现的。归根结底,语言的速度还不够快(尽管这可能是 Twitter 成功的原因——首先更容易启动和运行!!)。当他们用 Java 替换 ROR 时,他们能够消除 9/10 的服务器并获得更好的吞吐量。