Java中Collection和Set接口有什么区别?

3
声明的方法签名似乎是相等的。那么引入Set接口的目的是什么,而不是直接实现Collection接口?或者这只是一个标记接口吗?

你在说哪种编程语言? - SLaks
谢谢,已将“Java”添加到帖子中。 - Roman
4
Javadoc API指出了哪些区别?请查看类型和定义在这些类型上的方法以及约束条件:"Set接口除了从Collection接口继承的规约之外,还对所有构造函数的规约以及add,equals和hashCode方法的规约提出了额外的要求。其他继承方法的声明也包含在这里以方便使用。(这些声明附带的规范已经适用于Set接口,但它们不包含任何额外的规定。)" - user2864740
这里的标签解释 ^^ - xoned
1
编程并不总是关于方法;拥有一个Set接口,你可以在API中声明你期望或返回一个Set而不是任意的Collection。 - qqilihq
2个回答

1

Set保证集合中包含唯一元素(无重复项)。Collection不保证这一点。

Set接口仅包含从Collection继承的方法,并添加了禁止重复元素的限制。

Set还对equalshashCode操作的行为添加了更强的约定,即使它们的实现类型不同,也允许有意义地比较Set实例。如果两个Set实例包含相同的元素,则它们是相等的。

Set接口

注意,Set不保留插入元素的顺序。如果需要保留元素的插入顺序,则使用LinkedHashSethttps://dev59.com/MXRA5IYBdhLWcg3wzhRY#821104


0

我想我有点明白你想要了解的内容了。 :)

JDK(src.zip)附带的源代码有两个接口,CollectionSet,并且在Set接口中重新声明了Collection接口中声明的所有方法。 乍一看,重新声明这些方法似乎是多余的。但是如果你仔细观察,就会发现方法签名与Collection接口相同,但注释已更改以描述实现类中方法的行为。

为什么存在Set接口,如果在Set的情况下,集合接口已经足够(因为我们没有在Set接口中引入任何新方法)(FYI:这里我忽略了一个在Set接口中引入的方法- <T> T[] toArray(T[] a);)。

答案: 假设您有两个类ClassA和ClassB实现了Collection接口,并且它们都存储唯一元素(就像Set一样)。现在您有一个方法,比如populateSet(Collection setImpl);,并且您有特定于处理ClassA和ClassB的代码,此方法的目的是您可以使用此方法交替传递ClassA和ClassB,到目前为止一切都好。但是现在这个方法的问题是您可以将ArrayList传递给此方法,因为Collection接口是通用的,您的方法将开始破裂。这就是为什么我们需要一个更多的接口来将所有集合实现分类的原因。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接