LinkedHashSet 构造函数是否保留顺序

Does LinkedHashSet constructor preserve order

假设参数是有序集合,构造函数 LinkedHashSet(Collection<? extends E> c) 是否保证其参数的保留顺序?我们如何确定这一点?

Javadoc 文档对顺序只字不提:

Constructs a new linked hash set with the same elements as the specified collection. The linked hash set is created with an initial capacity sufficient to hold the elements in the specified collection and the default load factor (0.75).

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

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

iterates over the specified collection, and adds each object returned by the iterator to this collection, in turn.

查看 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实例的内容也将是有序的。

Java9 中的实现非常相似。

是的,订单会被保留,以防传入的集合被订购。

你只能通过检查这个特定案例中的实现来确定这一点。