You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java Set排序疑问:为何Collectors.toSet()返回有序结果?

问题原因及解决方法

为什么结果是有序的?

Java的Set接口仅规定不保证元素的迭代顺序,并非强制要求元素必须无序。而Collectors.toSet()的默认实现(从Java 8开始)返回的是HashSet,对于Integer类型的元素来说,它的hashCode()返回值就是自身的int值,HashSet的存储和迭代顺序会基于哈希值排列,恰好和Integer的自然顺序一致,所以你看到的结果是[1,2,3,4]。

这完全符合Set接口的规范——规范只是说不能依赖这个顺序,没说它一定不能有序。

如何保留原始输入的顺序?

如果你需要保留字符串长度对应的原始输入顺序,应该明确指定使用LinkedHashSet,它会维护元素的插入顺序。修改你的收集器代码即可:

public static Set<Integer> test(List<String> inputList){
    return inputList.stream()
        .map(String::length)
        .collect(Collectors.toCollection(LinkedHashSet::new));
}

这样执行测试代码后,输出就会是[4,2,3,1],和你预期的一致。

内容的提问来源于stack exchange,提问作者mansto

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 12:15:57