3

声明的方法签名似乎是相等的。那么引入 Set 接口而不是直接实现 Collection 的目的是什么?还是这里只是一个标记界面?

4

2 回答 2

1

Set保证集合将包含唯一元素(无重复)。ACollection不保证这一点。

Set 接口仅包含从 Collection 继承的方法,并添加了禁止重复元素的限制。

Set 还为equalshashCode操作的行为添加了更强的契约,即使 Set 实例的实现类型不同,也可以进行有意义的比较。如果两个 Set 实例包含相同的元素,则它们是相等的。

设置界面

注意,Set不保留插入元素的顺序。如果您LinkedHashSet需要保留元素的插入顺序。 https://stackoverflow.com/a/821104/4587961

于 2017-06-22T10:51:27.263 回答
0

我想我有点明白你想知道什么。:)

JDK附带的源代码(src.zip)有2个接口,Collection接口中Set声明的所有方法都在Collection接口中重新声明Set。乍一看,重新声明这些方法似乎是多余的。但是,如果您仔细观察,您会发现方法签名与Collection接口保持相同,但更改了注释以描述实现类中方法的行为。

Set如果集合接口在 Set 的情况下足够,为什么Set接口存在(因为我们没有在接口中引入任何新方法)(仅供参考:这里我忽略了Set接口中引入的一种方法 - <T> T[] toArray(T[] a);)。

Ans:假设您有两个类 ClassA 和 ClassB 实现 Collection 接口,并且它们都存储唯一元素(就像 Set)。现在你有一个方法,可以说populateSet(Collection setImpl);你有特定的代码来处理你的 ClassA 和 ClassB,这个方法的目的是你可以使用这个方法交替地传递 ClassA 和 ClassB,到目前为止一切都很好。但是现在这个方法的问题是你可以将 ArrayList 传递给这个方法,因为 Collection 接口是通用的,你的方法将开始崩溃。这就是为什么我们需要一个更多的接口来将所有集合实现分类到一个单一的引擎盖下。

于 2019-06-09T22:02:46.807 回答