LinkedHashSet构造函数是否保留顺序

时间:2017-10-19 13:18:20

标签: java collections linkedhashset

构造函数LinkedHashSet(Collection<? extends E> c)是否保证其参数的保留顺序,假设参数是有序集合?我们怎么能确定呢?

Javadoc文档没有说明订单:

  

构造一个新的链接哈希集,其元素与   指定的集合。链接的哈希集是使用初始值创建的   容量足以容纳指定集合中的元素   和默认加载因子(0.75)。

我没有看到任何理由不保留订单,但我想知道它是否有保证(对于当前和未来的实施)。

2 个答案:

答案 0 :(得分:2)

它保留了集合的迭代器返回的顺序,因为它在内部使用addAll

  

遍历指定的集合,并依次将迭代器返回的每个对象添加到此集合中。

答案 1 :(得分:1)

查看java.util.LinkedHashSet的Java 8实现,你有这个构造函数:

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

那么addAll的内容是什么?

public boolean addAll(Collection<? extends E> c) {
    boolean modified = false;
    for (E e : c)
        if (add(e))
            modified = true;
    return modified;
}

addAll使用构造函数中使用的集合循环:

for (E e : c)

这意味着如果构造函数中使用的集合实现是有序的(例如java.util.TreeSet),那么新的LinkedHashSet实例的内容也将被订购。

Java 9中的实现非常相似。

是的,订购时会保留订单。

您只能通过检查此特定情况下的实现来确定这一点。