我在与LinkedHashSet
相关的JAVA文档中遇到了以下内容:
Set接口的哈希表和链表实现,具有可预测的迭代顺序。
但是如果我看到LinkedHashSet
的来源,则找不到与implements/extends
或HashTable
相关的任何LinkedList
。那么它如何抑制这两个data structures
的功能?
它不会从这些类继承,也不会以任何方式使用它们。
但是您可以编写自己的链表类,即使它与java.util.LinkedList
没有关系,它仍然是链表。这就是LinkedHashSet
的工作方式:它既不使用java.util.Hashtable
,也不使用java.util.LinkedList
,但是仍然具有data structure的实现。
作为其他答案,该类不能通过使用HashTable
或LinkedList
类来获得其行为。这是java.util.LinkedHashSet
的类声明。
public class LinkedHashSet<E> extends HashSet<E> implements Set<E> ...
扩展HashSet
并实现Set
使它能够演示类似集合的属性(有关更多详细信息,请参见this answer)。至于有序的插入和检索,可以使用此类的迭代器完成:
public Spliterator<E> spliterator() {
return Spliterators.spliterator(this, 17);
}
17表示此迭代器的characteristics:
int特性()
返回此分隔符及其元素的一组特征。结果表示为ORDERED,DISTINCT,已排序,已分级,非空,不可变,并发,已订阅。 ...
17是与ORDERED和DISTINCT迭代器特征相对应的16和1的OR值,因此使该集合能够演示为链接的哈希集定义的行为。