2009-05-04 31 views
33

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

(例如,不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,或者我必须处理包含重复项的集合。
+1

很好的问题,但恕我直言不力的答案 – Kemoda 2013-08-30 06:26:34

回答

37

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

一般来说,您应该使用正确的工具进行工作。如果您不想重复,请使用Set(或SortedSet如果您想要订购,或者LinkedHashSet如果您想维护广告订单)。如果您想允许重复项,请使用List,依此类推。

+1

如何使用集合给你*更多*选项?使用更一般的东西通常会减少*力量。 – Martijn 2009-05-04 19:14:17

+5

它给调用一个采用Collection作为参数的方法的人提供了更多选择,因为他们可以传递List,Set或Queue而不必进行任何转换。 – 2009-05-04 19:20:54

+4

是的,我从撰写接受收藏的方法的人的角度讲话。正如我所说的,对于返回*的方法,我更喜欢使用适当的类型来完成这项工作。 – 2009-05-04 19:30:19

3

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

8

我想你已经想通了一个Set当你想明确排除重复。 Collection通常是最低公分母,并且指定接受/返回此API的API会很有用,这会在稍后根据需要留出空间来更改详细信息。但是,如果您的应用程序的详细信息需要唯一条目,请使用Set来执行此操作。

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

1

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

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

集合更通用。我相信戴维斯在他们的用法上写了什么说明了这一切。

2

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

当你将某些东西声明为一个Set而不是一个Collection时,你说这个变量不能是一个List或一个Map。但它始终是一个集合。因此,任何接受集合的函数都会接受集合,但接受集合的函数不能采集集合(除非将其转换为集合)。

1

实际区别在于Set强制执行集合逻辑,即没有重复和无序,而集合没有。所以,如果你需要一个集合,你没有特别的要求避免重复,那么使用一个集合。如果你有Set的需求,那么使用Set。通常使用最高的接口可能性。

2

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

我通常使用当我需要一个快速实现的contains()时,设置集合或列表,否则,即使集合不应该有重复。

0

由于集合是Set和SortedSet的超类型,所以这些可以传递给期望集合的方法。集合意味着它可能会或可能不会被分类,排序或允许重复。