2015-10-06 32 views
0

我从我的java课程中知道,当我实现一个接口时,我必须构建该接口中存在的所有方法。但是当我看了一下HashSet我观察到它没有构建Set接口的所有方法。为什么?为什么HashSet不会构建Set接口的所有方法

+0

你是什么意思没有“建立所有的方法?” 'Set'中定义的每个方法都由'HashSet'实现,或者由它的超类实现。 – resueman

+0

您认为哪些方法未实现? –

+0

如果没有实现所有必需的方法,(具体)类将无法编译。 – ergonaut

回答

0

查看超类AbstractSet。来自java文档:“这个类提供了Set接口的骨架实现,以最小化实现这个接口所需的工作。” HashSet扩展了AbstractSet,所以在AbstractSet中没有实现的东西在HashSet中实现。

0

HashSet实现了Set接口的所有方法。并非它们全部直接出现在HashSet代码中,因为一些(例如removeAll)从AbstractSet继承,而其他(例如toArray)从AbstractCollection继承。你可以在documentation中看到这一切。

这些抽象类非常有用。如果您扩展AbstractSet,则您只需覆盖size,containsiterator,即可免费获得正确运行的其他方法的版本(例如,containsAll,hashCode,toArray,stream)。无论如何,您可以选择覆盖它们以提高效率。

3

如果你看一下HashSet类的声明,你可以看到,除了实施SetCloneableSerializable,它扩展了AbstractSet类,它本身延伸AbstractCollection

例如,两个toArray()过载在AbstractCollection类中实现。 addAll(),containsAll(),retainAll()removeAll()方法也是如此。此外,removeAll()AbstractSet中被覆盖。

equals()hashCode()方法在Object中定义,在AbstractSet中被覆盖。

希望这有助于...

杰夫

相关问题