Java 在Collectors.toSet()中设置了哪个实现?

Java 在Collectors.toSet()中设置了哪个实现?,java,set,java-stream,java-11,collectors,Java,Set,Java Stream,Java 11,Collectors,我有以下代码: Stream.of(1, 4, 5).collect(Collectors.toSet()); 从toSet()方法中可以读取: 无法保证返回的集合的类型(…) 我查看了toSet()方法的实际实现,乍一看,它似乎总是返回HashSet(至少在JDK 11中是这样) 我知道实现在未来可能会发生变化而不会违反合同,但当前是否存在返回不同于HashSet的实现的情况?用于不同的Set实现: //将名称累积到树集中 Set Set=people.stream().map(Person

我有以下代码:

Stream.of(1, 4, 5).collect(Collectors.toSet());
toSet()
方法中可以读取:

无法保证返回的集合的类型(…)

我查看了
toSet()
方法的实际实现,乍一看,它似乎总是返回
HashSet
(至少在JDK 11中是这样)

我知道实现在未来可能会发生变化而不会违反合同,但当前是否存在返回不同于
HashSet
的实现的情况?

用于不同的Set实现:

//将名称累积到树集中
Set Set=people.stream().map(Person::getName).collect(Collectors.toCollection(TreeSet::new));
否。清楚地显示,
Collectors.toSet()
始终使用
HashSet::new
。正如您所说,这当然可能会改变。

收集器toSet()返回一个收集器,该收集器将输入元素累积到一个新的集合中。对于返回的集合的类型、可变性、序列化性或线程安全性没有任何保证。这是一个无序收集器,即收集操作不承诺保留输入元素的相遇顺序


如果您想对此有更多的控制,请改用toCollection。

从JDK 11开始,
collector.toSet()
返回的
Set
类型是
HashSet
。当然,这可能会在Java的未来版本中发生变化,因此您不应该依赖于此


如果您希望使用特定类型的
集合
,则应使用
收集器。改为使用
来收集
,并提供lambda来创建您选择的集合。

回答第二个问题

Collectors::toUnmodifiableSet

由于
java-11
,它返回一个在java-9中添加的不可变

不,它始终是一个hashset,但正如文档所说:不要依赖它,永远不要直接依赖于实现细节。如果出于某种原因需要哈希集,而其他类型的哈希集不起作用,只需转换得到的哈希集即可;可能存在任意实现,而不仅仅是JRE提供的实现。
Collectors::toUnmodifiableSet