首页 > 解决方案 > 在 Java 中设置排序

问题描述

我多次运行此代码(Java 11):

public static void main(String[] args) {
    System.out.println("-----------------------");
    Set<String> elements = Set.of("Neptunium", "Iodine", "Thallium", "Carbon", "Calcium");
    System.out.println(elements);
    elements = elements.stream()
            .map(n -> n.substring(0, 1))
            .collect(Collectors.toSet());

    for (String s : elements) {
        System.out.print(s);
    }
}

结果是:

[Thallium, Carbon, Neptunium, Iodine, Calcium]
CTIN
-----------------------
[Thallium, Calcium, Iodine, Neptunium, Carbon]
CTIN
-----------------------
[Neptunium, Iodine, Calcium, Thallium, Carbon]
CTIN
...

Set.of("Neptunium", "Iodine", "Thallium", "Carbon", "Calcium");正如我所期望的那样,第一组的顺序是不确定的。但是第二个Collectors.toSet()总是一样的。这是什么魔法?

标签: javaset

解决方案


Set.of()没有定义的迭代顺序,它会发生变化。

集合元素的迭代顺序未指定,可能会发生变化。

Collectors.toSet()没有定义Set使用哪个实现。

public static <T> Collector<T,?,Set<T>> toSet()

返回一个收集器,它将输入元素累积到一个新的Set. 不保证返回的 Set 的类型、可变性、可序列化性或线程安全性;如果需要对返回的更多控制Set,请使用toCollection(Supplier).

目前,供应商被硬编码为HashSet::new. 但它可以在未来改变。因此,如果您需要可预测的东西,最好将具体Set实现作为供应商传递。因为它HashSet当前正在返回并且您在创建时以相同的顺序传递元素,所以迭代每次都根据存储桶位置以特定顺序返回数据。这就是为什么结果是一致的。


推荐阅读