【问题标题】:when to use Set vs. Collection?何时使用 Set vs. Collection?
【发布时间】:2010-10-23 16:38:31
【问题描述】:

除了Collection 可以包含两次相同的元素之外,Java 中的SetCollection 之间是否有任何实际区别?他们有相同的方法。

(例如,Set 是否为我提供了更多使用接受 Sets 但不接受 Collections 的库的选项?)

编辑:我可以想到至少 5 种不同的情况来判断这个问题。其他人能想出更多吗?我想确保我理解这里的微妙之处。

  1. 设计一个接受SetCollection 参数的方法。 Collection 更通用,接受更多的输入可能性。 (如果我正在设计一个特定的类或接口,如果我使用Collection,我对我的消费者更好,对我的子类/实现者更严格。)
  2. 设计一个返回SetCollection 的方法。 Set 提供比Collection 更多的保证(即使只是保证不包含一个元素两次)。 (如果我正在设计一个特定的类或接口,如果我使用Set,我会对我的消费者更好,对我的子类/实现者更严格。)
  3. 设计一个实现接口SetCollection的类。与#2类似的问题。我的类/接口的用户得到更多保证,子类/实现者有更多责任。
  4. 设计一个扩展接口SetCollection的接口。与#3 非常相似。
  5. 编写使用SetCollection 的代码。这里我不妨使用Set;我使用 Collection 的唯一原因是如果我从其他人的代码中返回 Collection,或者我必须处理包含重复项的集合。

【问题讨论】:

    标签: java collections


    【解决方案1】:

    Collection 也是ListQueueDeque 等的超类型,因此它为您提供了更多选择。例如,我尝试将Collection 用作不应显式依赖于某种集合类型的库方法的参数。

    一般来说,您应该为工作使用正确的工具。如果您不想重复,请使用Set(如果您想订购,请使用SortedSet,或者如果您想保持插入顺序,请使用LinkedHashSet)。如果要允许重复,请使用List,等等。

    【讨论】:

    • 使用集合如何为您提供更多选项?使用更通用的东西通常会给你更少的力量。
    • 它为调用将 Collection 作为参数的方法的人提供了更多选项,因为他们可以传递 List、Set 或 Queue 而无需进行任何转换。
    • 是的,我是从编写接受集合的方法的人的角度说的。对于一个返回的方法,我更喜欢为工作使用合适的类型,正如我所说的。
    【解决方案2】:

    我想你已经想通了——当你想明确排除重复项时使用SetCollection 通常是最小的公分母,指定接受/返回它的 API 很有用,这为您留出了稍后在需要时更改细节的空间。但是,如果您的应用程序的详细信息需要唯一条目,请使用Set 强制执行此操作。

    同样值得考虑的是顺序对你来说是否重要;如果是,请使用List,如果您关心订单的唯一性,请使用LinkedHashSet

    【讨论】:

    • API 通常应该返回比Collection 更具体的类型。例如,如果可以返回 List,那么就这样做。只有不确定返回类型时,才可以考虑返回Collection
    【解决方案3】:

    请参阅 Java 的 Collection tutorial,了解 Collection 的使用情况。特别是,检查类层次结构。

    【讨论】:

      【解决方案4】:

      正如@mmyers 所说,Collection 包括 Set 以及 List。

      当您将某物声明为 Set 而不是 Collection 时,您是在说该变量不能是 List 或 Map。不过,它将永远是一个集合。因此,任何接受 Collection 的函数都将接受 Set,但接受 Set 的函数不能接受 Collection(除非您将其强制转换为 Set)。

      【讨论】:

      • 其实Map并没有扩展Collection。
      • 你是对的,我的错。我刚刚编辑了答案来解决这个问题。
      【解决方案5】:

      要考虑的另一件事...集合在时间、内存和编码方面有额外的开销,以确保没有重复。 (时间和内存,因为集合通常由 HashMap 或 Tree 支持,这会增加列表或数组的开销。编码是因为您必须实现 hashCode() 和 equals() 方法。)

      当我需要快速实现 contains() 时,我通常使用集合,否则使用 Collection 或 List,即使集合不应该有重复项。

      【讨论】:

        【解决方案6】:

        您应该在需要时使用 Set。

        例如,没有任何顺序或重复的列表。 contains 之类的方法非常有用。

        集合更加通用。我相信 mmyers 写的关于他们的用法说明了一切。

        【讨论】:

          【解决方案7】:

          实际的区别在于 Set 强制执行 set 逻辑,即没有重复和无序,而 Collection 没有。因此,如果您需要一个集合,并且您对避免重复没有特别的要求,那么请使用一个集合。如果您对 Set 有要求,请使用 Set。一般使用可能的最高接口。

          【讨论】:

            【解决方案8】:

            由于 Collection 是 Set 和 SortedSet 的超类型,因此可以将它们传递给需要 Collection 的方法。集合只是意味着它可能会或可能不会被排序、排序或允许重复。

            【讨论】:

              猜你喜欢
              • 2010-09-30
              • 2011-05-13
              • 1970-01-01
              • 2018-07-26
              • 1970-01-01
              • 2011-06-27
              • 2014-12-18
              • 2018-12-16
              • 2022-06-22
              相关资源
              最近更新 更多