4

我知道它们之间的区别,我理解这一点LinkedHashMapLinkedHashSet提供插入排序。我理解LinkedHashMap extends HashMapLinkedHashSet extends HashSet

为什么我们不总是使用LinkedHashMap代替,HashMap为什么我们不总是使用LinkedHashSet代替HashSet

4

3 回答 3

9

保持插入顺序有其相关成本,包括需要更多内存和花费额外的 CPU 周期:

  • 您需要额外的内存来保留额外的链接,
  • 您需要额外的 CPU 周期来维护它。

尽管渐近复杂度是相同的,但增加的便利性并不是免费的。如果您不需要维护广告订单,则不必为它“付费”,而是使用更轻量级的HashSet<E>andHashMap<K,V>代替。

于 2014-06-20T16:14:09.330 回答
2

在 LinkedhashMap / LinkedHashSet 中,排序是以效率为代价的。因此,当我们不需要 Ordering 时,我们可以使用 hashMap / HashSet。

于 2014-06-20T16:12:38.583 回答
0

关于成本的其他答案是正确的,但只是为了澄清为什么这很重要(这将是一个更好的评论,但它会太长。)

信不信由你,就 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 的服务器并获得更好的吞吐量。

于 2014-06-20T16:27:53.770 回答