也许我很挑剔,但在 javadoc 中有以下有关 LinkedHashSet 实现的信息:
此实现与 HashSet 的不同之处在于它维护一个双向链表,该列表贯穿其所有条目。
我在 LinkedHashSet 类中找不到任何双链表。有人可以帮忙吗?
也许我很挑剔,但在 javadoc 中有以下有关 LinkedHashSet 实现的信息:
此实现与 HashSet 的不同之处在于它维护一个双向链表,该列表贯穿其所有条目。
我在 LinkedHashSet 类中找不到任何双链表。有人可以帮忙吗?
双向链表在实现端,不一定公开给你获取和使用。
它保留双向链表,因此它可以跟踪您的项目插入集合的顺序(以及访问 顺序 LinkedHashMaps 中访问元素的顺序)。常规的 HashSet 不需要双向链表,因为它不保证其内容的顺序。
他们可能在 javadoc 中包含了这一点,只是为了让您知道他们是如何做到的,而且 LinkedHashSet 的幕后工作比常规的 HashSet 还要多。
您可以在Google 代码搜索中查看源代码(您会注意到 LinkedHashSet 实际上只是包裹在LinkedHashMap周围,但这不是一个非常重要的细节)。
最后,这不是 javadocs 中的错误,您不必担心在 LinkedHashSet 和 LinkedHashMap 中有一个双向链表。我们可以愉快地利用 LinkedHashMap 维护插入顺序,而不用关心幕后发生的事情。
是的,当您在不深入研究的情况下查看源代码时,这有点不稳定。请注意,它调用了包保护的 HashSet 构造函数,该构造函数接受一个名为 dummy 的无意义布尔值:
public LinkedHashSet(int initialCapacity, float loadFactor) {
super(initialCapacity, loadFactor, true);
}
然后使用 aLinkedHashMap
而不是 aHashMap
来支持集合。实际上,LinkedHashSet 实际上是在 HashSet 内部,它只是包保护的,所以你必须使用 LinkedHashSet 来获取它。