代码之家  ›  专栏  ›  技术社区  ›  Ethan Heilman

Java集合实现(例如HashMaps vs HashSet vs HashTable…),选择错误实现的成本是多少?[闭门]

  •  6
  • Ethan Heilman  · 技术社区  · 17 年前

    从实际的角度来看,如果选择了错误的实现,我在灵活性、可伸缩性、可读性和性能方面会损失多少?什么时候花时间决定使用一个而不是另一个才有意义?

    我当然明白,在某些情况下,为什么有人会使用LinkedList而不是ArrayList。什么时候有人觉得使用HashMap而不是TreeMap或HashTable很重要?布景怎么样?

    1. 是否有人对选择错误的实现和数据中心着火有过灾难性的经历?
    2. 有什么好的经验法则吗?

    我通读了:

    this 这个问题从理论的角度来看是相关的,但我更感兴趣的是现实世界,答案就在下面。

    3 回复  |  直到 6 年前
        1
  •  7
  •   Tom    17 年前

    这是一个非常笼统的问题,但我会提出一些想法。

    void foo(List<E> list);
    

    选择不当的成本可以从绩效惩罚中看出。例如,当直接访问(如ArrayList)是您要查找的内容时,选择LinkedList。

    布景也有类似的问题。如果您想保持已排序的集合不存在重复项,则SortedSet将是比HashSet更明智的选择。在后一种方法中,必须手动对整个集合进行排序(这是对Collections.sort()的调用)

    <EDIT>

    至于 maps ,有很多不同的实现。每一个都有不同的目的。 例如,有 SortedMap WeakHashMap ,它不像HashMap那样工作,因为垃圾收集器可以删除密钥。 可以想象,HashMap和WeakHashMap之间的选择并不简单。和往常一样,这取决于您想用它们实现什么。

    </EDIT>

    关于这个故事,在我当前的项目中,我们用SortedSet替换了HashSet,因为性能受到了影响。但数据中心并没有着火。

    我的两分钱。

        2
  •  1
  •   Nick Holt    17 年前

    只要你遵循良好的OO实践 取决于抽象类型 ,这有什么关系?

    例如,如果你发现你用错了 Map 您只需更改正在使用的实现,因为您的所有依赖项都在 一切都像以前一样工作,只是具有不同的性能特征。

        3
  •  1
  •   Carl Manaster    17 年前

    使用您列出的默认实现。当出现性能问题,并且有理由相信替代实现会更好时,将其替换掉——并测量差异。当您需要特殊行为(例如,排序集)时,请使用特殊类。

    这种方法还没有把我烧死。