Java 流收集器对给定的流进行排序

Eag*_*ger 3 set java-8 java-stream

你能告诉我为什么下面的代码返回给定未排序数组的集合排序顺序吗?

    Stream<Integer> s = Stream.of(2, 3, 1, 4, 5);

    Set<Integer> mySet = s.collect(Collectors.toSet());

    System.out.println(mySet);
Run Code Online (Sandbox Code Playgroud)

开/关

1, 2, 3, 4, 5
Run Code Online (Sandbox Code Playgroud)

如果我使用 List 而不是 Set,则不会发生这种情况。此外,当输入中有负数时,排序并不总是正确的。是否有任何内置功能可以对 Set 进行排序?

Luk*_*der 6

这只是一次意外,与Collector或无关Stream。在 OpenJDK 11.0.2 上,我得到了这个(Collector.toSet()目前由 支持HashSet):

Set<Integer> set = new HashSet<>();
set.add(2);
set.add(3);
set.add(1);
set.add(4);
set.add(5);
System.out.println(set); // [1, 2, 3, 4, 5]
Run Code Online (Sandbox Code Playgroud)

但是试试这个:

set.add(100);
System.out.println(set); // [1, 2, 3, 4, 100, 5]
Run Code Online (Sandbox Code Playgroud)

这真的只是一个意外。一个非常奇怪的,确实,它与Integer.hashCode()实现有关(它只是它Integer.intValue()本身),以及这如何导致HashSet某些集合的元素意外排序。

  • `Set::of` 不受此影响,至少如果运行足够多次的话 (2认同)