何时使用Set vs. Collection?

时间:2009-05-04 17:34:52

标签: java collections

除了Set可以包含两次相同的元素之外,Java中的CollectionCollection之间是否存在实际差异?他们有相同的方法。

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

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

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

8 个答案:

答案 0 :(得分:43)

Collection也是ListQueueDeque和其他人的超类型,因此它为您提供了更多选择。例如,我尝试使用Collection作为库方法的参数,这些库方法不应明确依赖于某种类型的集合。

通常,您应该使用正确的工具来完成工作。如果您不想要重复,请使用Set(或SortedSet如果您想要订购,或LinkedHashSet如果您想维护广告订单)。如果要允许重复,请使用List,依此类推。

答案 1 :(得分:8)

我认为你已经弄明白了 - 当你想要专门排除重复项时,请使用SetCollection通常是最低的公分母,指定接受/返回此API的API非常有用,如果需要,您可以在以后更改详细信息。但是,如果您的应用程序的详细信息需要唯一条目,请使用Set来强制执行此操作。

另外值得考虑的是订单对您来说是否重要;如果是,请使用ListLinkedHashSet,如果您关心订单的唯一性。

答案 2 :(得分:3)

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

答案 3 :(得分:3)

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

当您将某些内容声明为Set而不是Collection时,您说该变量不能是List或Map。但它总是一个收藏品。因此,任何接受Collection的函数都会接受Set,但是接受Set的函数不能接受Collection(除非你将它转换为Set)。

答案 4 :(得分:3)

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

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

答案 5 :(得分:1)

当你想要的时候,你应该使用Set。

例如,没有任何订单或重复的List。像contains这样的方法非常有用。

集合更通用。我相信mmyers在他们的用法上所说的就是这一切。

答案 6 :(得分:1)

实际差异在于Set强制执行 set 逻辑,即没有重复和无序,而Collection则没有。因此,如果您需要一个集合,并且您没有特别要求避免重复,那么请使用集合。如果您有Set的要求,请使用Set。通常使用最高的界面。

答案 7 :(得分:0)

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