首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >stream().collect(Collectors.toSet()) vs stream().distinct().collect(Collectors.toList())

stream().collect(Collectors.toSet()) vs stream().distinct().collect(Collectors.toList())
EN

Stack Overflow用户
提问于 2018-02-27 01:46:25
回答 2查看 5.8K关注 0票数 11

如果我有一个对象列表(~200个元素),其中只有几个唯一的对象(~20个元素)。我希望只有唯一的值。在list.stream().collect(Collectors.toSet()) and list.stream().distinct().collect(Collectors.toList())中,wrt延迟和内存消耗哪个更有效?

EN

回答 2

Stack Overflow用户

发布于 2018-02-27 05:05:24

尽管答案是显而易见的--不必为这些小元素的速度和内存消耗细节以及一个元素返回Set而另一个返回List的事实而烦恼;这里有一些有趣的小细节(有趣的IMO)。

假设您正在从一个已知为distinct的源进行流式传输,在这种情况下,您的.distinct()操作将是无操作的;因为实际上不需要执行任何操作。

如果你从一个List (按照设计是有序的)流式传输,并且没有改变顺序的中间操作(例如unordered),.distinct()将被迫通过在内部使用LinkedHashSet来保留顺序-这是非常昂贵的。

如果你在做并行处理,list.stream().collect(Collectors.toSet())版本将合并多个HashSet(在9版本中这比8版本稍有改进),另一方面,.distinct()将旋转一个ConcurrentHashMap,它将保留所有具有虚拟Boolean.TRUE值的键(它还做了一些有趣的事情来保留你的流可能拥有的null -即使在两种情况下内部处理是不同的)

票数 14
EN

Stack Overflow用户

发布于 2018-02-27 01:55:01

Set (通常是HashSet)比List (通常是ArrayList)消耗更多,这主要是因为它存储的哈希表。但是,使用这么少的元素,在内存消耗方面不会有明显的差异。

相反,您应该关心的是,这些收集器返回不同的东西:一个List和一个Set,它们有自己的特殊性,特别是当您访问它们的元素时。

因此,请使用与您想要对此集合执行的操作相匹配的方式。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48994190

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档