除了Set
可以包含两次相同的元素之外,Java中的Collection
和Collection
之间是否存在实际差异?他们有相同的方法。
(例如,Set
是否为我提供了更多选项来使用接受Set
但不接受Collection
s的库?)
编辑我至少可以考虑5种不同情况来判断这个问题。其他人可以提出更多吗?我想确保我理解这里的细微之处。
Set
或Collection
参数的方法。 Collection
更为通用,并且接受更多的输入可能性。 (如果我正在设计一个特定的类或接口,如果我使用Collection
,我对我的消费者更好,对我的子类/实现者更严格。)Set
或Collection
的方法。 Set
提供的保证比Collection
更多(即使只是保证两次不包含一个元素)。 (如果我正在设计一个特定的类或接口,如果我使用Set
,我对我的消费者更好,对我的子类/实现者更严格。)Set
或Collection
的类。与#2类似的问题。我的类/接口的用户得到更多的保证,子类/实现者有更多的责任。Set
或Collection
的界面。与#3非常相似。 Set
或Collection
的代码。在这里,我不妨使用Set
;我使用Collection
的唯一原因是,如果我从其他人的代码中取回Collection
,或者我必须处理包含重复项的集合。答案 0 :(得分:43)
Collection
也是List
,Queue
,Deque
和其他人的超类型,因此它为您提供了更多选择。例如,我尝试使用Collection
作为库方法的参数,这些库方法不应明确依赖于某种类型的集合。
通常,您应该使用正确的工具来完成工作。如果您不想要重复,请使用Set
(或SortedSet
如果您想要订购,或LinkedHashSet
如果您想维护广告订单)。如果要允许重复,请使用List
,依此类推。
答案 1 :(得分:8)
我认为你已经弄明白了 - 当你想要专门排除重复项时,请使用Set
。 Collection
通常是最低的公分母,指定接受/返回此API的API非常有用,如果需要,您可以在以后更改详细信息。但是,如果您的应用程序的详细信息需要唯一条目,请使用Set
来强制执行此操作。
另外值得考虑的是订单对您来说是否重要;如果是,请使用List
或LinkedHashSet
,如果您关心订单和的唯一性。
答案 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的方法。集合只是意味着它可能会或可能不会被排序,订购或允许重复。