何时使用Set vs. Collection?

Jas*_*n S 42 java collections

a Set和CollectionJava 之间是否有任何实际区别,除了a Collection可以包含两次相同的元素之外?他们有相同的方法.

(例如,是否Set给了我更多选项来使用接受Sets而不是Collections的库?)

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

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

Mic*_*ers 44

Collection也是超类型List,Queue,Deque,和其他人,所以它给你更多的选择.例如,我尝试将Collection库方法的参数用作不应明确依赖于某种类型集合的库方法.

通常,您应该使用正确的工具来完成工作.如果您不想要重复,请使用Set(或者SortedSet如果您想要订购,或者LinkedHashSet如果您想维护插入订单).如果要允许重复,请使用List,等等.

  • 它为调用将Collection作为参数的方法的人提供了更多选项,因为它们可以传递List,Set或Queue而无需进行任何转换. (8认同)
  • 是的,我是从写一个接受收藏品的方法的人的角度讲的.对于一个方法*返回*的东西,我更喜欢使用适当的类型来完成工作,正如我所说. (4认同)
  • 使用集合如何为您提供*更多*选项?使用更一般的东西通常会给您*更少*的功能。 (2认同)

Geo*_*old 8

我想你已经想到了 - Set当你想要专门排除重复时使用. Collection通常是最小的公分母,指定接受/返回此API的API很有用,这样您可以在以后根据需要更改详细信息.但是,如果您的应用程序的详细信息需要唯一条目,请使用Set强制执行此操作.

另外值得考虑的是订单对您来说是否重要; 如果是,使用List,或者LinkedHashSet如果您关心秩序和独特性.