集合<e>和集合<e>是一样的吗?</e> </e>

时间:2011-02-21 10:34:39

标签: java collections interface set

我对Java中的这两个接口有疑问。 设置扩展集合,但不添加任何内容。它们完全一样。 我在这里错过了什么吗?

6 个答案:

答案 0 :(得分:8)

设置不允许重复。

这是语义差异,而不是句法差异。

答案 1 :(得分:6)

来自Collection的文档:

  

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

来自Set的文档:

  

不包含重复元素的集合。更正式地说,集合不包含e1e2元素对,e1.equals(e2)和最多一个null元素。正如其名称所暗示的,该界面对数学集抽象进行建模。

这应该澄清Set和a(更通用的界面)Collection之间的区别。

答案 2 :(得分:5)

好问题。我想与Set的概念相比,明确拥有Collection概念的接口的主要目的是实际正式区分概念。假设您正在编写方法

void x(Collection<?> c);

您不会对想要获得的参数有同样的想法,就像您正在编写

一样
void x(Set<?> s);

第二种方法期望Collections最多包含一个元素一次(即Sets)。这与第一种方法有很大的语义差异,它不关心它是否接收SetsLists或任何其他类型的Collection

如果仔细观察,Set方法的Javadoc也会有所不同,明确显示在讨论CollectionSet

时发挥作用的不同概念

答案 3 :(得分:2)

Collection是一个更通用的界面,包括列表,队列,集等等。

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

答案 4 :(得分:0)

一切都在文档中:

  

Set - 包含no的集合   重复元素。更正式的,   集合不包含元素对e1   和e2使得e1.equals(e2)和at   大多数一个null元素。正如所暗示的那样   它的名字,这个界面模型   数学集抽象。

  

Collection - 中的根接口   集合层次。一个集合   代表一组已知的对象   作为其要素。一些收藏品   允许重复元素和其他元素   不。有些是订购的和其他的   无序的。 SDK不提供   任何直接的实现   interface:它提供实现   更具体的子接口,如   设置和列表。这个界面是   通常用于传递集合   围绕并操纵它们在哪里   期望最大化。

仅用于区分实施和未来的使用。

这来自Set理论和词典

Collection - something that is collected; a group of objects or an amount of material accumulated in one location, especially for some purpose or as a result of some process

Set - is a collection of distinct objects

答案 5 :(得分:0)

此外,Set文档定义了.equals的合同,其中“只有其他集合可能等于此集合。如果我们无法按类型识别其他集合(使用instanceof),则无法实现此功能。

如果仅适用于equals(),则allowsDuplicates()的{​​{1}}方法可能会有Collection。但是通常情况下API会说“请不要给我重复”或“我保证这不包含重复”,而在Java中,没有办法在方法声明中说“请仅提供其allowsDuplicates()方法返回false“。因此附加类型。