Java 收藏<;E>;和Set<;E>;都一样吗?

Java 收藏<;E>;和Set<;E>;都一样吗?,java,collections,interface,set,Java,Collections,Interface,Set,我有一个关于Java中这两个接口的问题。 集合扩展集合,但不添加任何内容。他们完全一样。 我在这里遗漏了什么吗?集合不允许重复 这是一种语义上的差异,而不是语法上的差异。集合是一种更通用的接口,它由列表、队列、集合等组成 查看“所有已知子接口”部分。好问题。我想,与集合的概念相比,显式地为集合的概念提供一个接口的主要目的是在形式上区分概念。假设您正在编写一个方法 void x(Collection<?> c); void x(集合c); 你不会对你想要得到的论点有相同的想法,就像

我有一个关于Java中这两个接口的问题。 集合扩展集合,但不添加任何内容。他们完全一样。
我在这里遗漏了什么吗?

集合不允许重复


这是一种语义上的差异,而不是语法上的差异。

集合是一种更通用的接口,它由列表、队列、集合等组成


查看“所有已知子接口”部分。

好问题。我想,与
集合
的概念相比,显式地为
集合
的概念提供一个接口的主要目的是在形式上区分概念。假设您正在编写一个方法

void x(Collection<?> c);
void x(集合c);
你不会对你想要得到的论点有相同的想法,就像你在写作一样

void x(Set<?> s);
void x(集合s);
第二种方法要求
集合最多包含一次每个元素(即
集合
)。这与第一个方法在语义上有很大的区别,它不关心是否接收
集合
列表
或任何其他类型的
集合


如果仔细观察,
Set
方法的Javadoc也不同,它明确地显示了从
Collection
的文档中谈论
Collection
Set
时使用的不同概念:

集合表示一组对象,称为其元素有些集合允许重复元素,有些则不允许。有些是有序的,有些是无序的


集合的文档中

不包含重复元素的集合。更正式地说,集合不包含一对元素
e1
e2
,因此
e1.equals(e2)
,最多一个
null
元素。正如它的名字所暗示的,这个接口为数学集合抽象建模


这应该澄清
集合
和(更通用的接口)
集合
之间的区别,所有内容都在文档中:

集合-不包含任何元素的集合 重复元素。更正式地说, 集合不包含元素对e1 和e2,使得e1等于(e2),并且 大多数情况下只有一个空元素。正如 它的名字,这个接口模型 数学集合抽象

集合中的根接口 集合层次结构。收藏 表示一组已知的对象 作为它的元素。一些藏品 允许重复元素,其他元素不允许重复 不有些是命令式的,有些是命令式的 无序的。SDK不提供 这有什么直接的实现吗 接口:它提供实现 更具体的子接口,如 设置并列出。此接口是 通常用于传递集合 在哪里操纵他们 需要最大的通用性

这只是为了区分实现和将来的使用

这来自集合论和字典


此外,
集合
文档定义了
.equals
的合同,其中规定“只有其他集合可以与此集合相等”。如果我们不能按类型识别其他集合(使用
instanceof
),那么就不可能实现这一点


如果它仅用于
equals()
,则可以使用
allowsDuplicates()
方法进行
收集。但是,在很多情况下,API希望说“请不要给我重复项”或“我保证这不包含重复项”,而在Java中,在方法声明中无法说“请只给
allowsdeplices()
method返回false的集合”。因此,额外的类型。

+1:规范对于接口来说和方法定义一样重要。所以我不明白。为什么需要设置。在集合和集合中插入两次相同的对象。但是,我还是不明白。如果Set只是通过它的名称暗示我们有一个没有多个对象的集合,并且没有通过任何代码更改来强制它,那么为什么我们需要它呢。如果我正在实现集合,我可以用一个表示该行为的名称来调用我的类。因为这样,我可以在我的方法中正式地期望一个
参数,而不仅仅是一个普通的
集合
。这是我遵循这条思路的众多原因之一。如果你能举出一个有用的例子供进一步参考,我将不胜感激。嗯,举出一个例子。。。好的,去查看
java.util.Map
接口。它有以下两种方法,例如:
Set keySet()
Collection values()
。众所周知,每个键在
映射中只能包含一次,并且键的顺序是不相关的。因此,
集合
集合
更好,因为它正式传达了这一事实。对于
values()
则不同。我们不知道一个值是否可以在一个映射中包含多次,并且排序也不相关。所以最好的选择是
收藏