0

java.lang.util中的接口Set与同一个包的Collection具有完全相同的结构。

在继承层次结构中,AbstractSetSetAbstractCollection的子集,两者都是 Collection 的子

Set 的另一个直接后代是SortedSet,而 SortedSet仅扩展Set

我想知道的是, java.lang.util 中的Set什么好处——为什么会在那里?

如果我没有遗漏任何内容,那么它不会向 API 的当前结构或层次结构添加任何内容。如果AbstractSet没有实现 Set 而只是扩展了AbstractCollection,而SortedSet 直接扩展了Collection ,那么一切都是一样的。

我唯一能想到的是Set用于文档目的。

不应该用于进一步构建/重新构建层次结构——这意味着对后代的结构修改并且没有意义。

如果我在这里遗漏了什么,我正在寻找验证或反驳。

//=============================================

编辑:问题是:“为什么要设置在那里”——它为 API 的结构添加了什么?”

很明显,集合在数学上是多么特别。

4

4 回答 4

8

Set和中的方法Collection具有相同的签名和返回类型,但它们具有不同的行为契约……源于一个集合不能多次包含“相同”元素的事实。这就是为什么它们是不同的接口。

它不仅仅是文档。由于 Java 不执行“鸭子类型”,因此 和 之间的区别在Collection编译Set时和运行时类型检查中都是可见的。

这种区别是有用的。如果只有Collection,那么您将无法编写需要没有重复的集合作为参数的方法。


你写:

除了评论之外,Set 是 Collection 的副本/粘贴。

我知道。评论是行为契约。他们很关键。没有其他方法可以指定某些东西在 Java 1, 2中的行为方式

参考:


1 - 在一种或两种语言中,您可以在语言本身中指定“合同”的行为方面。埃菲尔是经典的例子……它引发了“按合同设计”的范式。

2 - 事实上,JML系统向 Java 添加了形式化的前置条件、后置条件和不变量,并使用自动定理证明器来检查它们。问题是很难将它与 Java 语言的类型系统/静态类型检查器完全集成。(当定理证明者说“我不知道”时,你如何静态类型检查某些东西……因为它不够聪明,无法证明/反驳代码中的 JML 断言?)

于 2013-08-05T02:25:22.563 回答
4

集合不能包含重复的元素。收藏可以。

于 2013-08-05T02:25:10.533 回答
0

Set是一个Collection不包含重复项的集合。从页面获取更多信息:

更正式地说,集合不包含一对元素 e1 和 e2 使得 e1.equals(e2),并且最多包含一个空元素。正如它的名字所暗示的,这个接口模拟了数学集合抽象。

除了从 Collection 接口继承的那些之外,Set 接口对所有构造函数的合约以及 add、equals 和 hashCode 方法的合约进行了额外的规定。为方便起见,此处还包括其他继承方法的声明。(这些声明随附的规范已针对 Set 接口进行了定制,但它们不包含任何附加规定。)

毫不奇怪,对构造函数的附加规定是,所有构造函数都必须创建一个不包含重复元素的集合(如上所述)。

如果Set不存在,则无法在Collection. Collection代码是否与 相同,存在以强制执行行为限制并不重要,Set因为由于定义的行为,当Set是时implemented,实现类必须遵守其行为契约。

于 2013-08-05T02:25:51.130 回答
0

java.lang.util 中的 Set 有什么好处——为什么会在那里?

将集合与其他集合分开可以让您编写代码,以便只能传入一个集合。这是一个有用的示例:

public void sendMessageTo(Collection<String> addresses) {
    addresses.add("admin@example.com"); //The admin might now be on the list twice, and gets two emails, oops :(
    //do something
}

我想更改界面以获取 Set:

public void sendMessageTo(Set<String> addresses) {
    addresses.add("admin@example.com"); //This will add the admin if they were not already on the list, otherwise it won't because Sets don't allow duplicates
    //do something
}
于 2013-08-05T04:24:42.020 回答