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
相关产品推荐
相关产品推荐

