Java 8 Java流收集器对给定流进行排序
你能让我知道为什么下面的代码返回一个未排序数组的集合排序顺序吗Java 8 Java流收集器对给定流进行排序,java-8,set,java-stream,Java 8,Set,Java Stream,你能让我知道为什么下面的代码返回一个未排序数组的集合排序顺序吗 Stream<Integer> s = Stream.of(2, 3, 1, 4, 5); Set<Integer> mySet = s.collect(Collectors.toSet()); System.out.println(mySet); 如果我使用列表而不是集合,则不会发生这种情况。 此外,当输入中有负数时,排序并不总是正确的。 是否有任何内置功能来对集合进行排序?这
Stream<Integer> s = Stream.of(2, 3, 1, 4, 5);
Set<Integer> mySet = s.collect(Collectors.toSet());
System.out.println(mySet);
如果我使用列表而不是集合,则不会发生这种情况。
此外,当输入中有负数时,排序并不总是正确的。
是否有任何内置功能来对集合进行排序?这只是一个意外,与
收集器
或流
无关。在OpenJDK 11.0.2上,我得到了以下信息(因为Collector.toSet()
当前由HashSet
支持):
这真的只是个意外。确实,这是一个非常奇怪的问题,它与
Integer.hashCode()
实现有关(它只是Integer.intValue()
本身),以及这如何导致对某些集合的HashSet
元素进行意外排序。这只是巧合。接口不提供任何排序保证,但是。排序也不总是正确的。请参见这是一个无序收集器。Set::of
不受此影响,至少如果运行足够的时间,您还可以通过将结构更改为new HashSet(4,2f)
,使结果更有趣。或者您将构造更改为newhashset(1,5f)
,以开始查看插入顺序,但是set.add(100)
会破坏它…
1, 2, 3, 4, 5
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]
set.add(100);
System.out.println(set); // [1, 2, 3, 4, 100, 5]