其实,这不仅仅是HashSet
. All的实施Set
Java 6 中的接口基于底层Map
。这不是一个要求;这就是实现的方式。您可以通过查看各种实现的文档来亲自了解Set http://java.sun.com/javase/6/docs/api/java/util/Set.html.
您的主要问题是
但是,为什么它仍然被使用呢?有没有
除了制造它之外还有任何理由使用它
更容易维护代码?
我认为代码维护是一个很大的激励因素。防止重复和膨胀也是如此。
Set
and Map
是相似的接口,因为不允许重复的元素。 (我认为唯一Set
not由一个支持Map
is CopyOnWriteArraySet
,这是一个不寻常的 Collection,因为它是不可变的。)
具体来说:
来自的文档Set http://java.sun.com/javase/6/docs/api/java/util/Set.html:
一个集合不包含
重复的元素。更正式地说,
集合不包含元素对 e1
和 e2 使得 e1.equals(e2),并且在
最多一个空元素。正如所暗示的
正如它的名字一样,这个接口模型
数学集合抽象。
Set 接口放置了额外的
规定,超出继承的规定
从集合界面上
所有建造商的合同以及
add、equals 和 的合约
哈希码方法。声明
其他继承的方法也是
为方便起见,将其包含在此处。 (这
随附的规格
声明已根据
设置接口,但不包含
任何附加规定。)
附加规定
毫不奇怪,构造函数
所有构造函数都必须创建一个
不包含重复项的集合
元素(如上定义)。
并从Map http://java.sun.com/javase/6/docs/api/java/util/Map.html:
将键映射到值的对象。
映射不能包含重复的键;每个键最多可以映射到一个值。
如果你能实现你的Set
如果使用现有代码,您可以从现有代码中实现的任何好处(例如速度)都会增加到您的Set
以及。
如果您选择实施Set
没有Map
支持,您必须复制旨在防止重复元素的代码。啊,真是美妙的讽刺。
也就是说,没有什么可以阻止您实施您的Set
不同的是。