HashSet 与 LinkedHashSet

新手上路,请多包涵

它们之间有什么区别?我知道

LinkedHashSet 是 HashSet 的有序版本,它维护一个跨所有元素的双向链表。当您关心迭代顺序时,请使用此类而不是 HashSet。当您遍历 HashSet 时,顺序是不可预测的,而 LinkedHashSet 允许您按照插入元素的顺序遍历元素。

但是在LinkedHashSet 的源代码中,只有调用HashSet 的构造函数。那么双向链表和插入顺序在哪里呢?

原文由 Shikarn-O 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 717
2 个回答

正如您所说,两者之间的区别是:

LinkedHashSetHashSet 的有序版本,它维护所有元素的双向链表。当您关心迭代顺序时,请使用此类而不是 HashSet 。当您遍历 HashSet 时,顺序是不可预测的,而 LinkedHashSet 让您可以按照插入元素的顺序遍历元素。

至于你的问题:

但是在LinkedHashSet 的源代码中,只有调用HashSet 的构造函数。

答案在于 LinkedHashSet 使用 哪些构造函数 来构造基类:

 public LinkedHashSet(int initialCapacity, float loadFactor) {
    super(initialCapacity, loadFactor, true);      // <-- boolean dummy argument
}

...

public LinkedHashSet(int initialCapacity) {
    super(initialCapacity, .75f, true);            // <-- boolean dummy argument
}

...

public LinkedHashSet() {
    super(16, .75f, true);                         // <-- boolean dummy argument
}

...

public LinkedHashSet(Collection<? extends E> c) {
    super(Math.max(2*c.size(), 11), .75f, true);   // <-- boolean dummy argument
    addAll(c);
}

并且(一个例子)描述了一个 HashSet 采用布尔参数的构造函数,看起来像这样:

 /**
 * Constructs a new, empty linked hash set.  (This package private
 * constructor is only used by LinkedHashSet.) The backing
 * HashMap instance is a LinkedHashMap with the specified initial
 * capacity and the specified load factor.
 *
 * @param      initialCapacity   the initial capacity of the hash map
 * @param      loadFactor        the load factor of the hash map
 * @param      dummy             ignored (distinguishes this
 *             constructor from other int, float constructor.)
 * @throws     IllegalArgumentException if the initial capacity is less
 *             than zero, or if the load factor is nonpositive
 */
HashSet(int initialCapacity, float loadFactor, boolean dummy) {
    map = new LinkedHashMap<E,Object>(initialCapacity, loadFactor);
}

原文由 aioobe 发布,翻译遵循 CC BY-SA 4.0 许可协议

HashSet无序 且未排序 的 Set。

LinkedHashSet 是 HashSet 的 _有序版本_。

HashSetLinkedHashSet 之间的唯一区别是:

LinkedHashSet 维护插入顺序。

当我们遍历 HashSet 时,顺序是不可预测的,而在 LinkedHashSet 的情况下是可预测的。

LinkedHashSet 维护插入顺序的原因是:

底层使用的数据结构是 Doubly-Linked-List

原文由 Hema Ganapathy 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题