构造函数LinkedHashSet(Collection<? extends E> c)
是否保证其参数的保留顺序,假设参数是有序集合?我们怎么能确定呢?
Javadoc文档没有说明订单:
构造一个新的链接哈希集,其元素与 指定的集合。链接的哈希集是使用初始值创建的 容量足以容纳指定集合中的元素 和默认加载因子(0.75)。
我没有看到任何理由不保留订单,但我想知道它是否有保证(对于当前和未来的实施)。
答案 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中的实现非常相似。
是的,订购时会保留订单。
您只能通过检查此特定情况下的实现来确定这一点。