我对Java中的这两个接口有疑问。 设置扩展集合,但不添加任何内容。它们完全一样。 我在这里错过了什么吗?
答案 0 :(得分:8)
设置不允许重复。
这是语义差异,而不是句法差异。
答案 1 :(得分:6)
来自Collection
的文档:
集合表示一组对象,称为其元素。 某些集合允许重复元素,而其他集合则不允许。某些集合是有序的,而其他集合则是无序的。
来自Set
的文档:
不包含重复元素的集合。更正式地说,集合不包含
e1
和e2
元素对,e1.equals(e2)
和最多一个null
元素。正如其名称所暗示的,该界面对数学集抽象进行建模。
这应该澄清Set
和a(更通用的界面)Collection
之间的区别。
答案 2 :(得分:5)
好问题。我想与Set
的概念相比,明确拥有Collection
概念的接口的主要目的是实际正式区分概念。假设您正在编写方法
void x(Collection<?> c);
您不会对想要获得的参数有同样的想法,就像您正在编写
一样void x(Set<?> s);
第二种方法期望Collections
最多包含一个元素一次(即Sets
)。这与第一种方法有很大的语义差异,它不关心它是否接收Sets
,Lists
或任何其他类型的Collection
如果仔细观察,Set
方法的Javadoc也会有所不同,明确显示在讨论Collection
或Set
答案 3 :(得分:2)
Collection是一个更通用的界面,包括列表,队列,集等等。
查看“所有已知子接口”部分here。
答案 4 :(得分:0)
一切都在文档中:
Set - 包含no的集合 重复元素。更正式的, 集合不包含元素对e1 和e2使得e1.equals(e2)和at 大多数一个null元素。正如所暗示的那样 它的名字,这个界面模型 数学集抽象。
和
Collection - 中的根接口 集合层次。一个集合 代表一组已知的对象 作为其要素。一些收藏品 允许重复元素和其他元素 不。有些是订购的和其他的 无序的。 SDK不提供 任何直接的实现 interface:它提供实现 更具体的子接口,如 设置和列表。这个界面是 通常用于传递集合 围绕并操纵它们在哪里 期望最大化。
仅用于区分实施和未来的使用。
这来自Set理论和词典
答案 5 :(得分:0)
此外,Set
文档定义了.equals
的合同,其中“只有其他集合可能等于此集合。如果我们无法按类型识别其他集合(使用instanceof
),则无法实现此功能。
如果仅适用于equals()
,则allowsDuplicates()
的{{1}}方法可能会有Collection
。但是通常情况下API会说“请不要给我重复”或“我保证这不包含重复”,而在Java中,没有办法在方法声明中说“请仅提供其allowsDuplicates()
方法返回false“。因此附加类型。