假设参数是有序集合,构造函数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).
我认为没有任何理由不保留订单,但我想知道它是否有保证(对于当前和未来的实施).
解决方法:
查看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中的实现非常相似.
是的,如果订购了收集集,则会保留订单.
您只能通过检查此特定情况下的实现来确定这一点.