ToSet()和 HashSet

以下面这行示例代码为例:

Set<String> someSet = someColletion.stream().map(p -> p.toString()).collect(Collectors.toSet());

我要 HashSet。对代码进行调试之后,我确实得到了一个 HashSet。我查看了 java.util.stream.Collectors.toSet()以观察以下代码:

public static <T> Collector<T, ?, Set<T>> toSet() {
return new CollectorImpl<>((Supplier<Set<T>>) HashSet::new, Set::add,
(left, right) -> { left.addAll(right); return left; },
CH_UNORDERED_ID);
}

合同 保证 a Set,并且实现决定于 HashSet; 似乎是合理的。但是,我的实现需要 HashSet保证的常量时间查找,而不是任何旧的 Set。如果 toSet()的实现决定使用完全在其权限范围内的 FooSet,那么我的实现就会受到损害。

解决这个问题的最佳实践方法是什么?

55972 次浏览

If you want a guaranteed HashSet, use Collectors.toCollection(HashSet::new).