Java中的Collection和Set接口有啥区别?

Posted

技术标签:

【中文标题】Java中的Collection和Set接口有啥区别?【英文标题】:What is the difference between Collection and Set interfaces in Java?Java中的Collection和Set接口有什么区别? 【发布时间】:2014-03-17 06:04:50 【问题描述】:

声明的方法签名似乎是相等的。那么引入 Set 接口而不是直接实现 Collection 的目的是什么?还是这里只是一个标记界面?

【问题讨论】:

你说的是什么语言? 谢谢,在帖子中添加了“Java” Javadoc API 所说的有什么不同?查看基于此类定义的类型和方法以及约束:“Set 接口对所有构造函数的合约以及 add、equals 和hashCode 方法。为方便起见,此处还包括其他继承方法的声明。(这些声明随附的规范已针对 Set 接口进行了定制,但它们不包含任何附加规定。)" 这里的标签解释^^ 它并不总是关于方法;拥有 Set 接口,您可以在 API 中声明您期望或返回 Set 而不是任意 Collection。 【参考方案1】:

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

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

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

The Set Interface

注意,Set 不保留元素插入的顺序。 如果您需要保留元素的插入顺序,请LinkedHashSet。 https://***.com/a/821104/4587961

【讨论】:

【参考方案2】:

我想我有点明白你想知道什么。 :)

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

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

Ans:假设您有两个类 ClassA 和 ClassB 实现 Collection 接口,并且它们都存储独特的元素(就像 Set)。现在您有一个方法,可以说populateSet(Collection setImpl);,并且您有专门用于处理 ClassA 和 ClassB 的代码,并且此方法的目的是您可以使用此方法交替传递 ClassA 和 ClassB,到目前为止一切正常。但是现在这个方法的问题是你可以将 ArrayList 传递给这个方法,因为 Collection 接口是通用的,你的方法将开始破坏。这就是为什么我们需要一个接口来将所有集合实现归类到单一引擎盖下。

【讨论】:

以上是关于Java中的Collection和Set接口有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

Java中的Set集合

java中集合类中Collection接口中的Set接口的常用方法熟悉

Java Collection接口之: List接口&Set接口

Java进阶--Set接口

Set接口

java之Set接口(单列集合)