【问题标题】:Is a Collection better than a LinkedList?Collection 是否比 LinkedList 更好?
【发布时间】:2013-03-19 20:47:09
【问题描述】:
Collection list = new LinkedList(); // Good?
LinkedList list = new LinkedList(); // Bad?

第一个变体提供了更大的灵活性,但仅此而已吗?还有其他喜欢它的理由吗?性能呢?

【问题讨论】:

  • Collection 是一个由 LinkedList 实现的接口。您应该始终指向实现中的接口。

标签: java collections


【解决方案1】:

这些是设计决策,一种尺寸通常无法满足所有需求。此外,成员变量内部使用的内容的选择可以(通常应该)不同于暴露给外部世界的内容。

从本质上讲,Java 的集合框架并没有提供一整套描述性能 特性的接口,而没有公开实现细节。描述性能的一个接口RandomAccess 是一个标记接口,它甚至没有扩展Collection 或重新公开get(index) API。所以我认为没有一个好的答案。

根据经验,在我识别(并记录)某些重要特征之前,我会尽可能保持类型不具体。例如,只要我想让方法知道保留插入顺序,我就会从 Collection 更改为 List,并记录为什么该限制很重要。同样,如果说从前面有效移除变得很重要,则从List 移动到LinkedList

在公开 API 中公开集合时,我总是尝试只公开少数预期会被使用的 API;例如add(...)iterator()

【讨论】:

    【解决方案2】:
    Collection list = new LinkedList(); //bad
    

    这很糟糕,因为你不希望这个引用引用一个 HashSet(因为 HashSet 也实现了 Collection,集合框架中的许多其他类也是如此)。

    LinkedList list = new LinkedList(); //bad?
    

    这很糟糕,因为好的做法是始终对接口进行编码。

    List list = new LinkedList();//good
    

    这很好,因为点 2 天。(Always Program To an Interface)

    【讨论】:

    • @Aboutblank Array 不是集合,Map 也不是 Collection :)
    • 第一种情况不一定不好,你应该解释一下原因。
    • @PermGenError - 是的,但这假设您关心列表语义与集合语义。换句话说,这是一个设计时的决定(也就是说,选择 Collection 而不是 List 并总是不好)。
    • @zhong.j.yu - 抱歉,我 100% 不同意。也许您可以提出令人信服的论点,但我对此表示怀疑。
    • 因为这个Collection list = new LinkedList(); //bad,我拒绝投票,因为它还不错。如果您只关心Collection,那么List 又有什么关系呢?为什么要关心Collection LinkedListArrayList 还是HashSet
    【解决方案3】:

    在非公共对象上使用最具体的类型信息。它们是实现细节,我们希望我们的实现细节尽可能具体和精确。

    【讨论】:

      【解决方案4】:

      当然。例如,如果 java 会为 List 集合找到并实现更有效的实现,但您已经拥有只接受 LinkedList 的 API,如果您已经有此 API 的客户端,您将无法替换实现。如果您使用接口,您可以轻松地替换实现而不破坏 API。

      【讨论】:

        【解决方案5】:

        它们是绝对等价的。使用其中一个的唯一原因是,如果您以后要使用仅存在于 LinkedList 类中的列表功能,则需要使用第二个。

        【讨论】:

          【解决方案6】:

          我的一般规则是仅在您当时需要的具体情况下(或在不久的将来,在合理范围内)。当然,这有点主观。

          在您的示例中,我通常将其声明为 List 只是因为 Collection 上可用的方法不是很强大,以及 List 和另一个 Collection 之间的区别(Map,@ 987654326@ 等)通常具有逻辑意义。

          另外,在 Java 1.5+ 中不要使用原始类型 - 如果您不知道列表将包含的类型,至少使用 List<?>

          【讨论】:

            猜你喜欢
            • 2021-06-19
            • 2019-04-26
            • 2011-02-24
            • 2011-09-04
            • 1970-01-01
            • 1970-01-01
            • 2023-04-02
            • 2016-04-07
            • 2015-04-08
            相关资源
            最近更新 更多