java.lang.util 中的界面设置具有完全相同的结构 作为同一个包的集合。
在继承层次结构中, AbstractSet 是 分别为设置和 AbstractCollection 其中包括集合。
Set的另一个直接后代是 SortedSet , SortedSet 仅扩展设置。
我想知道的是, java.lang.util 中设置的收益是什么? - 为什么会出现?
如果我没有遗漏任何东西,那就不会添加任何东西 到API的当前结构或层次结构。 如果 AbstractSet 没有,那么全部都是一样的 实现Set但只是扩展 AbstractCollection 和 SortedSet 直接扩展收藏。
我唯一能想到的是设置是出于文档目的。
不应该用于进一步构建/重新构建层次结构 - 这意味着 后代的结构修改并没有意义。
如果我在这里遗漏了什么,我正在寻找验证或反驳。
// ===========================================
编辑:Q是:“为什么设置在那里” - 它是什么增加了API的结构?“
明显如何在数学集合中特别设置集合。
答案 0 :(得分:8)
Set
和Collection
中的方法具有相同的签名和返回类型,但它们具有不同的行为合同...源于一个集合不能包含的事实不止一次“相同”的元素。这就是为什么它们是不同的界面。
这不仅仅是文档。由于Java不执行“duck typing”,因此Collection
和Set
之间的区别在编译时和运行时类型检查中都是可见的。
这种区别是有用的。如果只有Collection
,那么您将无法编写需要一个没有重复项作为参数的集合的方法。
你写道:
Set是除了评论之外的Collection的复制/粘贴。
我知道。评论是行为合同。他们很关键。没有其他方法可以在Java 1,2 中指定行为的内容。
参考:
1 - 在一种或两种语言中,您可以在语言本身中指定“合同”的行为方面。埃菲尔是典型的例子......它产生了“按合同设计”范式。
2 - 实际上,JML系统为Java添加了正式的前置条件,后置条件和不变量,并使用自动定理证明器对它们进行检查。问题是很难将它与Java语言的类型系统/静态类型检查器完全集成。 (当定理证明者说“我不知道”时,你如何静态地检查一些东西...因为它不够智能来证明/反驳代码中的JML断言?)
答案 1 :(得分:4)
一个集合不能包含重复元素。集合可以。
答案 2 :(得分:0)
Set是Collection
,不包含任何重复项。有关该页面的更多信息:
更正式地说,套装不包含任何一对 元素e1和e2使得e1.equals(e2),并且至多为1 元件。正如其名称所暗示的那样,该界面对其进行建模 数学集抽象。
除了那些之外,Set界面还有其他规定 继承自Collection接口,在所有合同上 构造函数和add,equals和hashCode的契约 方法。还包括其他继承方法的声明 这里是为了方便。 (随附的规格 声明已经针对Set接口进行了定制,但它们没有 包含任何其他规定。)
对于建造者的额外规定,这并不奇怪 所有构造函数都必须创建一个不包含重复元素的集合 (如上所述)。
如果Set
不存在,则无法在Collection
中强制执行唯一性。代码与Collection
相同并不重要,Set
存在以强制执行行为限制,因为由于定义的行为,当Set
为implemented
时,实施课程必须遵守其行为合同。
答案 3 :(得分: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
}