java - 在 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()
总是一样的。这是什么魔法?
解决方案
集合元素的迭代顺序未指定,可能会发生变化。
Collectors.toSet()
没有定义Set
使用哪个实现。
public static <T> Collector<T,?,Set<T>> toSet()
返回一个收集器,它将输入元素累积到一个新的
Set
. 不保证返回的 Set 的类型、可变性、可序列化性或线程安全性;如果需要对返回的更多控制Set
,请使用toCollection(Supplier)
.
目前,供应商被硬编码为HashSet::new
. 但它可以在未来改变。因此,如果您需要可预测的东西,最好将具体Set
实现作为供应商传递。因为它HashSet
当前正在返回并且您在创建时以相同的顺序传递元素,所以迭代每次都根据存储桶位置以特定顺序返回数据。这就是为什么结果是一致的。
推荐阅读
- javascript - 在 select 上动态添加选项标签,其值是从服务器填充的不工作
- python - 子类化 Pandas DatetimeIndex
- r - 在 R 中使用 ggplot2 时如何使用数据框中的列指定颜色和线型?
- javascript - 按多个对象数组的索引排序
- stdmap - std::map 使用在值构造期间获得的键
- javascript - 输出来源不明
- ios - 使用 SwiftUI 创建 Grid/ UICollectionView
- neo4j - Neo4j 计数不可预测
- java - 在 Java 中使用多线程解析 XML
- c# - Razor 页面中的范围和变量类型(已更正)