也许我很挑剔,但在javadoc中有关于LinkedHashSet实现的以下信息:
此实现不同于 HashSet在它维护一个 双向链表贯穿 所有条目。
我在LinkedHashSet类中找不到任何双链表。有人可以帮忙吗?
答案 0 :(得分:6)
双向链表在实施方面,不一定暴露给你获取和使用。
它保留了双向链表,以便它可以跟踪您的项目插入集合的顺序(以及访问access-order LinkedHashMaps中元素的顺序)。常规HashSet不需要双向链表,因为它不保证其内容的顺序。
他们可能在javadoc中包含了这一点,所以你知道他们是如何做到的,并且使用LinkedHashSet而不是普通的HashSet在幕后进行更多的操作。
您可以查看Google Code Search处的源代码(您会注意到LinkedHashSet实际上只是围绕LinkedHashMap,但这不是一个非常重要的细节。)
最后,这不是javadoc中的错误,你不应该担心在LinkedHashSet和LinkedHashMap中有一个双向链表。我们可以快乐地利用LinkedHashMap维护插入顺序,不用担心幕后发生的事情。
答案 1 :(得分:4)
是的,当你在没有向下钻取的情况下查看源时,它有点不稳定。请注意,它调用了包受保护的HashSet构造函数,该构造函数接受一个名为dummy的无意义布尔值:
public LinkedHashSet(int initialCapacity, float loadFactor) {
super(initialCapacity, loadFactor, true);
}
然后使用LinkedHashMap
代替HashMap
来支持该集合。实际上,LinkedHashSet实际上是在HashSet中,它只是受到包保护,所以你必须使用LinkedHashSet来实现它。